StompJS使用文档总结:如何创建stomp客户端、如何连接服务器、心跳机制...

StompJS使用文档总结:如何创建stomp客户端、如何连接服务器、心跳机制...

2023年7月7日发(作者:)

StompJS使⽤⽂档总结:如何创建stomp客户端、如何连接服务器、⼼跳机制、如何发送消。。。  建议结合这两篇博客⼀起看:      STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,简单(流)⽂本定向消息协议,它提供了⼀个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进⾏交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语⾔和多种平台上得到⼴泛地应⽤。⼀、创建STOMP客户端1、在web浏览器中使⽤普通的Web Socket  STOMP javascript 客户端会使⽤ ws:// 的URL与STOMP 服务端进⾏交互。  为了创建⼀个STOMP客户端 js 对象,你需要使⽤ (url),⽽这个URL连接着服务端的WebSocket的代理var url = "ws://localhost:61614/stomp";var client = (url);  (url, protocols)也可以⽤来覆盖默认的subprotocols。第⼆个参数可以是⼀个字符串或⼀个字符串数组去指定多个subprotocols。2、在web浏览器中使⽤定制的WebSocket  浏览器提供了不同的WebSocket的协议,⼀些⽼的浏览器不⽀持WebSocket的脚本或者使⽤别的名字。默认下, 会使⽤浏览器原⽣的WebSocket class 去创建WebSocket。  但是利⽤ (ws) 这个⽅法可以使⽤其他类型的 WebSockets,这个⽅法得到⼀个满⾜WebSocket定义的对象。例如,可以使⽤由 SockJS 实现的Websocket。  如果使⽤原⽣的 Websocket 就使⽤ (url),如果需要使⽤其他类型的 Websocket(例如由SockJS包装的Websocket)就使⽤(ws)。除了初始化有差别,Stomp API 在这两种⽅式下是相同的。3、在 程序中  通过stompjs npm package同样也可以在程序中使⽤这个库。// 安装npm install stompjs  在中,require这个模块:var Stomp = require('stompjs');  为了与建⽴在TCP socket的STOMP-broker连接,使⽤P(host, port)⽅法。var client = P('localhost', 61613);  为了与建⽴在Web Socket的STOMP broker连接,使⽤(url)⽅法。var client = ('ws://localhost:61614/stomp');  除了初始化不同,⽆论是浏览器还是环境下,Stomp API都是相同的。⼆、连接服务端  ⼀旦 Stomp 客户端建⽴了,必须调⽤它的 connect() ⽅法去连接 Stomp 服务端进⾏验证。这个⽅法需要两个参数,⽤户的登录和密码凭证。这种情况下,客户端会使⽤Websocket打开连接,并发送⼀个 CONNECT frame。  这个连接是异步进⾏的:你不能保证当这个⽅法返回时是有效连接的。为了知道连接的结果,你需要⼀个回调函数。var connect_callback = function() { // called back after the client is connected and authenticated to the STOMP server};  但是如果连接失败会发⽣什么呢?  connect()⽅法接受⼀个可选的参数(error_callback),当客户端不能连接上服务端时,这个回调函数error_callback会被调⽤,该函数的参数为对应的错误对象。var error_callback = function(error) { // display the error's message header: alert(e);};  在⼤多数情况下,connect()⽅法可接受不同数量的参数来提供简单的API:t(login, passcode, connectCallback);t(login, passcode, connectCallback, errorCallback);t(login, passcode, connectCallback, errorCallback, host);  login和passcode是strings,connectCallback和errorCallback则是functions。(有些brokers(代理)还需要传递⼀个host(String类型)参数。)  如果你需要附加⼀个headers头部,connect⽅法还接受其他两种形式的参数:t(headers, connectCallback);t(headers, connectCallback, errorCallback);  header是map形式,connectCallback和errorCallback为functions。  需要注意:如果你使⽤上述这种⽅式,你需要⾃⾏在headers添加login、passcode(甚⾄host):var headers = { login: 'mylogin', passcode: 'mypasscode', // additional header 'client-id': 'my-client-id'};t(headers, connectCallback);  断开连接时,调⽤disconnect⽅法,这个⽅法也是异步的,当断开成功后会接收⼀个额外的回调函数的参数。如下所⽰。nect(function() { alert("See you next time!");};  当客户端与服务端断开连接,就不会再发送或接收消息了。三、Heart-beating  如果STOMP broker(代理)接收STOMP 1.1版本的帧,heart-beating是默认启⽤的。  heart-beating也就是频率,incoming是接收频率,outgoing是发送频率。通过改变incoming和outgoing可以更改客户端的heart-beating(默认为10000ms):ng = 20000;

// client will send heartbeats every ng = 0;// client does not want to receive heartbeats// from the server  heart-beating是利⽤erval()去规律地发送heart-beats或者检查服务端的heart-beats。四、发送消息  当客户端与服务端连接成功后,可以调⽤ send() 来发送STOMP消息。这个⽅法必须有⼀个参数,⽤来描述对应的STOMP的⽬的地。另外可以有两个可选的参数:headers,object类型包含额外的信息头部;body,⼀个String类型的参数。("/queue/test", {priority: 9}, "Hello, STOMP");// client会发送⼀个STOMP发送帧给/queue/test,这个帧包含⼀个设置了priority为9的header和内容为“Hello, STOMP”的body。  (destination, {}, body);  如果你想发送⼀个有body的信息,也必须传递headers参数。如果没有headers需要传递,那么就传{}即可。五、订阅(Subscribe)和接收(receive)消息  为了在浏览器中接收消息,STOMP客户端必须先订阅⼀个⽬的地 destination。  你可以使⽤subscribe()去订阅。这个⽅法有2个必需的参数:⽬的地(destination),回调函数(callback);还有⼀个可选的参数headers。其中destination是String类型,对应⽬的地,回调函数是伴随着⼀个参数的function类型。var subscription = ibe("/queue/test", callback);  subscribe()⽅法返回⼀个object,这个object包含⼀个id属性,对应这个这个客户端的订阅ID。  ⽽unsubscribe()可以⽤来取消客户端对这个⽬的地destination的订阅。  默认情况下,如果没有在headers额外添加,这个库会默认构建⼀个独⼀⽆⼆的ID。在传递headers这个参数时,可以使⽤你⾃⼰的ID。var mysubid = '...';var subscription = ibe(destination, callback, { id: mysubid });  这个客户端会向服务端发送⼀个STOMP订阅帧(SUBSCRIBE frame)并注册回调事件。每次服务端向客户端发送消息时,客户端都会轮流调⽤回调函数,参数为对应消息的STOMP帧对象(Frame object)。  subscribe()⽅法,接受⼀个可选的headers参数⽤来标识附加的头部。var headers = {ack: 'client', 'selector': "location = 'Europe'"};ibe("/queue/test", message_callback, headers);  这个客户端指定了它会确认接收的信息,只接收符合这个selector : location = 'Europe'的消息。  如果想让客户端订阅多个⽬的地,你可以在接收所有信息的时候调⽤相同的回调函数:onmessage = function(message) { // called every time the client receives a message}var sub1 = ibe("queue/test", onmessage);var sub2 = ibe("queue/another", onmessage)  如果要中⽌接收消息,客户端可以在subscribe()返回的object对象调⽤unsubscribe()来结束接收。var subscription = ibe(...);...cribe();六、⽀持JSON  STOMP消息的body必须为字符串。如果你需要发送/接收JSON对象,你可以使⽤ify()和()去转换JSON对象。七、Acknowledgment(确认)  默认情况,在消息发送给客户端之前,服务端会⾃动确认(acknowledged)。  客户端可以选择通过订阅⼀个⽬的地时设置⼀个ack header为client或client-individual来处理消息确认。  在下⾯这个例⼦,客户端必须调⽤()来通知服务端它已经接收了消息。var subscription = ibe("/queue/test", function(message) { // do something with the message ... // and acknowledge it (); }, {ack: 'client'});  ack()接受headers参数⽤来附加确认消息。例如,将消息作为事务(transaction)的⼀部分,当要求接收消息时其实代理(broker)已经将ACK STOMP frame处理了。var tx = ();({ transaction: , receipt: 'my-receipt' });();  nack()也可以⽤来通知STOMP s(代理):客户端不能消费这个消息。与ack()⽅法的参数相同。⼋、事务(Transactions)  可以在将消息的发送和确认接收放在⼀个事务中。  客户端调⽤⾃⾝的begin()⽅法就可以开始启动事务了,begin()有⼀个可选的参数transaction,⼀个唯⼀的可标识事务的字符串。如果没有传递这个参数,那么库会⾃动构建⼀个。这个⽅法会返回⼀个object。这个对象有⼀个id属性对应这个事务的ID,还有两个⽅法:  commit()提交事务  abort()中⽌事务  在⼀个事务中,客户端可以在发送/接受消息时指定transaction id来设置transaction。// start the transactionvar tx = ();// send the message in a ("/queue/test", {transaction: }, "message in a transaction");// commit the transaction to effectively send the ();  如果你在调⽤send()⽅法发送消息的时候忘记添加transction header,那么这不会称为事务的⼀部分,这个消息会直接发送,不会等到事务完成后才发送。var txid = "unique_transaction_identifier";// start the transactionvar tx = ();// oops! send the message outside the ("/queue/test", {}, "I thought I was in a transaction!");(); // Too late! the message has been sent九、调试  有⼀些测试代码能有助于你知道库发送或接收的是什么,从⽽来调试程序。  客户端可以将其debug属性设置为⼀个函数,传递⼀个字符串参数去观察库所有的debug语句。默认情况,debug消息会被记录在在浏览器的控制台。 = function(str) { // append the debug log to a #debug div somewhere in the page using JQuery: $("#debug").append(str + "n");};⼗、使⽤情况1、var error_callback = function(error) {  第⼀次连接失败和连接后断开连接都会调⽤这个函数};2、关闭控制台调试数据:设置 = null 就可以,stompjs会去检测debug是否是函数,不是函数就不会调⽤输出。

发布者:admin,转转请注明出处:http://www.yc00.com/web/1688683205a162180.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信