STOMP-WebSocket
中⽂⽂档
STOMP-WebSocket中⽂⽂档
前⾔
什么是Stomp
STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)⽂本定向消息协议,它提供了⼀个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进⾏交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语⾔和多种平台上得到⼴泛地应⽤。
协议⽀持
该库⽀持多种版本的STOMP协议:
下载STOMP.JS
你可以下载  并在你⾃⼰的WEB应⽤程序中使⽤。
提供了也可以直接⽤于⽣产。
这个js⽂件由CoffeeScript⽂件构建,请查看部分下载源码或浏览
服务端要求
这个库不是单纯的Stomp 客户端。它旨在WebSockets上运⾏⽽不是TCP。基本上,WebSocket协议需要在浏览器客户端和服务端之间进⾏握⼿,确保浏览器的“same-origin”(同源)安全模型仍然有效。
这意味着该库不能连接常规的STOMP 代理,因为Websocket初始化的握⼿不是STOMP协议的⼀部分,他们不能理解从⽽会拒绝连接。有⼀些正在进⾏的⼯作添加了WebSocket⽀持STOMP代理,从⽽他们可以在WebSocket协议上接受STOMP连接。HornetQ
HornetQ是由Red Hat and JBoss创⽴的开源消息系统.
要使HornetQ⽀持STOMP Over WebSocket,下载最新版本并按照下列步骤执⾏:
此时HornetQ已经开启了,并且61614在端⼝监听STOMP over WebSocket
websocket和socket
它从URL为ws://localhost:61614/stomp 接受WebSocket的连接。
ActiveMQ
ActiveMQ Apollo
(包含 heart-beating)
RabbitMQ
Stilts & Torquebox
是⼀个STOMP原⽣的消息框架。
使⽤Stilts去提供它的。
Stomp API
STOMP 帧(Frame)
STOMP Over WebSocket 提供了⼀个直接从Stomp Frame映射到 Javascript 对象的⽅式。
Stomp Frame帧格式如下:
Property Type Notes
command String name of the frame (“CONNECT”, “SEND”, etc.)
headers JavaScript object
body String
command和headers属性始终会被定义,不过当这个frame没有头部时,headers可以为空。若这个frame没有body,body的值可以为null。
创建STOMP客户端
在web浏览器中使⽤普通的Web Socket
STOMP javascript 客户端会使⽤ws://的URL与STOMP 服务端进⾏交互。
为了创建⼀个STOMP客户端js对象,你需要使⽤Stomp.client(url),⽽这个URL连接着服务端的WebSocket的代理:
Stomp.client(url, protocols)也可以⽤来覆盖默认的subprotocols。第⼆个参数可以是⼀个字符串或⼀个字符串数组去指定多
个subprotocols。
在web浏览器中使⽤定制的WebSocket
浏览器提供了不同的WebSocket的协议,⼀些⽼的浏览器不⽀持WebSocket的脚本或者使⽤别的名字。默认下,stomp.js会使⽤浏览器原⽣的WebSocket class去创建WebSocket。
但是利⽤Stomp.over(ws)这个⽅法可以使⽤其他类型的WebSockets。这个⽅法得到⼀个满⾜WebSocket定义的对象。
例如,可以使⽤由SockJS实现的Websocket:
如果使⽤原⽣的Websockets就使⽤Stomp.client(url),如果需要使⽤其他类型的Websocket(例如由SockJS包装的Websocket)就使⽤Stomp.over(ws)。
除了初始化有差别,Stomp API在这两种⽅式下是相同的。
在node.js程序中
通过stompjs npm package同样也可以在node.js程序中使⽤这个库。
在node.js app中, require这个模块:
为了与建⽴在TCP socket的STOMP-broker连接,使⽤Stomp.overTCP(host, port)⽅法。
为了与建⽴在Web Socket的STOMP broker连接,使⽤Stomp.overWS(url)⽅法。
除了初始化不同,⽆论是浏览器还是node.js环境下,Stomp API都是相同的。
连接服务端
⼀旦Stomp 客户端建⽴了,必须调⽤它的connect()⽅法去连接,从⽽Stomp服务端进⾏验证。这个⽅法需要两个参数,⽤户的登录和密码凭证。
这种情况下,客户端会使⽤Websocket打开连接,并发送⼀个CONNECT frame。
这个连接是异步进⾏的:你不能保证当这个⽅法返回时是有效连接的。为了知道连接的结果,你需要⼀个回调函数。
但是如果连接失败会发⽣什么呢?connect()⽅法接受⼀个可选的参数(error_callback),当客户端不能连接上服务端时,这个回调函
数error_callback会被调⽤,该函数的参数为对应的错误对象。
在⼤多数情况下,connect()⽅法可接受不同数量的参数来提供简单的API:
login和passcode是strings,connectCallback和errorCallback则是functions。(有些brokers(代理)还需要传递⼀个host(String 类型)参数。)
如果你需要附加⼀个headers头部,connect⽅法还接受其他两种形式的参数:
header是map形式,connectCallback和errorCallback为functions。
需要注意:如果你使⽤上述这种⽅式,你需要⾃⾏在headers添加login,passcode(甚⾄host):
断开连接时,调⽤disconnect⽅法,这个⽅法也是异步的,当断开成功后会接收⼀个额外的回调函数的参数。如下所⽰。
client.disconnect(function() {
alert(“See you next time!”);
};
当客户端与服务端断开连接,就不会再发送或接收消息了。
Heart-beating
如果STOMP broker(代理)接收STOMP 1.1版本的帧,heart-beating是默认启⽤的。heart-beating也就是频率,incoming是接收频率,outgoing是发送频率。
通过改变incoming和outgoing可以更改客户端的heart-beating(默认为10000ms):
heart-beating是利⽤window.setInterval()去规律地发送heart-beats或者检查服务端的heart-beats。
发送消息
当客户端与服务端连接成功后,可以调⽤send()来发送STOMP消息。这个⽅法必须有⼀个参数,⽤来描述对应的STOMP的⽬的地。另外可以有两个可选的参数:headers,object类型包含额外的信息头部;body,⼀个String类型的参数。
client会发送⼀个STOMP发送帧给/queue/test,这个帧包含⼀个设置了priority为9的header和内容为“Hello, STOMP”的body。
如果你想发送⼀个有body的信息,也必须传递headers参数。如果没有headers需要传递,那么就传{}即可,如下所⽰:
订阅(Subscribe)和接收(receive)消息
为了在浏览器中接收消息,STOMP客户端必须先订阅⼀个⽬的地destination。
你可以使⽤subscribe()去订阅。这个⽅法有2个必需的参数:⽬的地(destination),回调函数(callback);还有⼀个可选的参
数headers。其中destination是String类型,对应⽬的地,回调函数是伴随着⼀个参数的function类型。
subscribe()⽅法返回⼀个object,这个object包含⼀个id属性,对应这个这个客户端的订阅ID。⽽unsubscribe()可以⽤来取消客户端对这个⽬的地destination的订阅。
默认情况下,如果没有在headers额外添加,这个库会默认构建⼀个独⼀⽆⼆的ID。在传递headers这个参数时,可以使⽤你⾃⼰的ID:
这个客户端会向服务端发送⼀个STOMP订阅帧(SUBSCRIBE frame)并注册回调事件。每次服务端向客户端发送消息时,客户端都会轮流调⽤回调函数,参数为对应消息的STOMP帧对象(Frame object)。如下所⽰:
subscribe()⽅法,接受⼀个可选的headers参数⽤来标识附加的头部。
这个客户端指定了它会确认接收的信息,只接收符合这个selector : location = 'Europe'的消息。
如果想让客户端订阅多个⽬的地,你可以在接收所有信息的时候调⽤相同的回调函数:
如果要中⽌接收消息,客户端可以在subscribe()返回的object对象调⽤unsubscribe()来结束接收。
⽀持JSON
STOMP消息的body必须为字符串。如果你需要发送/接收JSON对象,你可以使⽤JSON.stringify()和JSON.parse()去转换JSON对象。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。