为什么80%的码农都做不了架构师?>>>   

1. STOMP简介

STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,它是一个简单的文本消息传输协议,提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。

2. 协议支持

  • STOMP 1.0
  • STOMP 1.1 (including heart-beating)

3. 下载JavaScript客户端包文件

stomp.min.js,可直接使用于web项目中

4. STOMP API介绍

4.1 STOMP Frame(帧)

STOMP Over WebSocket 提供了一个直接从 STOMP frame到JavaScript object的映射。

Frame Object

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。

4.2 STOMP客户端创建(普通的WebSocket方式)

STOMP JavaScript客户端将使用URL为 ws:// 与STOMP server建立通信。

使用 Stomp.client(url) 来创建STOMP客户端的js对象,如:

var url = "ws://localhost:61614/stomp";
var client = Stomp.client(url);

使用Stomp.client(url, protocols)可以覆盖默认的subprotocols,如protocols为['v10.stomp','v11.stomp'] 基于STOMP 1.0 & 1.1规范,第二个参数可以为单独的一个String类型,也可以为一个String的数组类型。

4.3 STOMP客户端创建(自定义WebSocket方式)

web浏览器支持不同的WebSocket协议版本,但是一些老版本的浏览器不支持WebSocket方式创建的js脚本,可以使用stomp.js,stomp.js会使用浏览器原生的WebSocket class来创建WebSocket。

使用Stomp.over(ws)方法,ws参数可以指定其他类型的WebSocket(如SockJS包装的WebSocket)

<script src="http://cdn.sockjs.org/sockjs-0.3.min.js"></script>
<script>// 使用SockJS实现而不是浏览器的本地实现var ws = new SockJS(url);var client = Stomp.over(ws);[...]
</script>

4.4 在node.js应用中的使用

使用npm安装stompjs

> npm install stompjs

在node.js程序中通过require导入stompjs模块

var Stomp = require('stompjs');

建立一个基于TCP socket的连接到STOMP代理

var client = Stomp.overTCP('localhost', 61613);

建立一个基于Web Socket的连接到STOMP代理

var client = Stomp.overWS('ws://localhost:61614/stomp');

除了初始化不同,无论是浏览器还是node.js环境下,Stomp API都是相同的。

4.5 连接到服务端

当STOMP client创建好后,通过connect()方法进行与STOMP seerver的连接和认证,connect方法可接受多个参数来提供简单的API。

client.connect(login, passcode, connectCallback);
client.connect(login, passcode, connectCallback, errorCallback);
client.connect(login, passcode, connectCallback, errorCallback, host);

注:login与passcode是String类型,connectCallback与errorCallback是回调函数,host为String类型

如果需要附加一些其他的信息,可以通过传递一个headers参数。

client.connect(headers, connectCallback);
client.connect(headers, connectCallback, errorCallback);

注:headers为map类型, connectCallback与errorCallback为回调函数

如附加的headers参数

var headers = {login: 'mylogin',passcode: 'mypasscode',// additional header'client-id': 'my-client-id'
};
client.connect(headers, connectCallback);

也可使用{}来表示不附加任何headers参数

断开连接时,调用disconnect方法,这个方法也是异步的,当断开成功后会接收一个额外的回调函数的参数,如:

client.disconnect(function() {alert("See you next time!");
};

当客户端client断开连接后,不能再发送和接收任何messages。

4.6 心跳检测(heart-beating)

如果STOMP 代理接收的帧是STOMP 1.1协议时,默认心跳检测是开启的。

客户端client对象有一个字段 heartbeat ,通过改变incoming和outgoing数值,来配置心跳频率(默认频率值为:10000ms)

client.heartbeat.outgoing = 20000; // 客户端每20000ms发送一次心跳检测
client.heartbeat.incoming = 0;     // client不接收serever端的心跳检测

注:heart-beating是利用window.setInterval()去规律地发送heart-beats或者检查服务端的heart-beats

4.7 发送消息

当客户端与服务端连接成功后,可以调用send()方法来发送STOMP消息。这个方法必须有一个参数, 用来描述对应的STOMP的目的地。另外可以有两个可选的参数:headers,object类型,包含额外的信息头;body为一个String类型的参数。

client.send("/queue/test", {priority: 9}, "Hello, STOMP");

代码解释:客户端将发送一个STOMP的帧到 /queue/test 地址的目的地,携带的headers参数priority为9,消息体为Hello, STOMP

注:如果你想发送一个有消息体(body)的信息,也必须传递headers参数。如果没有headers需要传递,可以用{}来表示,如:

client.send(destination, {}, body);

4.8 订阅(Subscribe)和接收消息

浏览器接收一个消息,STOMP客户端首先必须订阅一个目标地址destination。

使用subscribe()方法订阅,该方法接收两个必选的参数destination String类型的目的地址和callback回调函数,还有一个可选的参数headers

var subscription = client.subscribe("/queue/test", callback);

subscribe()方法返回一个js对象,这个对象包含一个id属性,对应这个这个客户端的订阅id。而unsubscribe()可以用来取消客户端对这个目的地destination的订阅。

默认情况下,如果没有在headers参数中额外添加,这个库会默认构建一个唯一的id。在传递headers这个参数时,可以使用你自己的id如:

var mysubid = '...';
var subscription = client.subscribe(destination, callback, { id: mysubid });

客户端发送一个STOMP的订阅帧到服务端,并注册一个回调函数,每当服务端发送消息到客户端时,客户端都会调用回调函数,回调函数中的参数为STOMP帧对象。

callback = function(message) {// called when the client receives a STOMP message from the serverif (message.body) {alert("got message with body " + message.body)} else {alert("got empty message");}
});

subscribe()方法接收一个可选的参数headers,当订阅一个目的地destination的时候可以附加该参数

var headers = {ack: 'client', 'selector': "location = 'Europe'"};
client.subscribe("/queue/test", message_callback, headers);

代码解释:该客户端只接收匹配selector location = 'Europe'的消息,并且会确认接收到的message

注:如果想让客户端订阅多个目的地destinations,可以使用同一个回调函数来接收messages

onmessage = function(message) {// called every time the client receives a message
}
var sub1 = client.subscribe("queue/test", onmessage);
var sub2 = client.subscribe("queue/another", onmessage);

调用unsubscribe()方法可以终止接收messages

var subscription = client.subscribe(...);...subscription.unsubscribe();

4.9 JSON的支持

如果想发送和接收JSON对象的消息,可以通过JSON.stringify() 和 JSON.parse()来转换

var quote = {symbol: 'APPL', value: 195.46};client.send("/topic/stocks", {}, JSON.stringify(quote));client.subcribe("/topic/stocks", function(message) {var quote = JSON.parse(message.body);alert(quote.symbol + " is at " + quote.value);
};

4.10 消息确认

默认情况,在消息发送给客户端之前,服务端会自动确认。

客户端可以选择通过订阅一个目的地destination时设置一个ack,header为client或client-individual来处理消息确认。

在下面这个例子,客户端必须调用message.ack()来通知客户端它已经接收了消息。

var subscription = client.subscribe("/queue/test",function(message) {// do something with the message...// and acknowledge itmessage.ack();},{ack: 'client'}
);

使用nack()方法可以通知STOMP 1.1 代理,客户端没有消费该消息,和ack()方法的参数相同

4.11 事务(Transactions)

消息的发送确认可以在一个事务中处理。

通过调用客户端自身的begin()方法来启动事务,该方法有一个可选的参数transaction,String类型,唯一标识一个事务,如果没有传递参数,那么stompjs库会自动生成。该方法会返回一个js对象,包含一个id属性,对应该事务的ID。

另外两个方法:

  • commit()提交事务
  • abort()终止事务

在一个事务中,客户端可以在发送/接受消息时指定transaction id来设置transaction。

// start the transaction
var tx = client.begin();
// send the message in a transaction
client.send("/queue/test", {transaction: tx.id}, "message in a transaction");
// commit the transaction to effectively send the message
tx.commit();

注:如果在调用send()方法发送消息时未指定transaction头信息,则该事务不起作用,如:

var txid = "unique_transaction_identifier";
// start the transaction
var tx = client.begin();
// oops! send the message outside the transaction
client.send("/queue/test", {}, "I thought I was in a transaction!");
tx.abort(); // Too late! the message has been sent

4.12 Debug调试

有一些测试代码能有助于你知道库发送或接收的是什么,从而来调试程序。

客户端可以将其debug属性设置为一个函数,传递一个字符串参数去观察库所有的debug语句。

client.debug = function(str) {// append the debug log to a #debug div somewhere in the page using JQuery:$("#debug").append(str + "\n");
};

转载于:https://my.oschina.net/feinik/blog/853875

WebSocket子协议STOMP详解相关推荐

  1. WebSocket安卓客户端实现详解(一)–连接建立与重连

    http://blog.csdn.net/zly921112/article/details/72973054 前言 这里特别说明下因为WebSocket服务端是公司线上项目所以这里url和具体协议我 ...

  2. IPv4、IPv6地址、组播地址及子网子划分详解三可变长子网掩码

    IPv4.IPv6地址.组播地址及子网子划分详解三可变长子网掩码 5.5.可变长子网掩码(VlSM) 5.5.可变长子网掩码(VlSM) 先看一下分类组网,路由选择协议RIPv1没有包含子网信息的字段 ...

  3. 一致性协议raft详解(四):raft在工程实践中的优化

    一致性协议raft详解(四):raft在工程实践中的优化 前言 性能优化 client对raft集群的读写 参考链接 前言 有关一致性协议的资料网上有很多,当然错误也有很多.笔者在学习的过程中走了不少 ...

  4. 一致性协议raft详解(三):raft中的消息类型

    一致性协议raft详解(三):raft中的消息类型 前言 raft 节点 Raft中RPC的种类 RequestVote leader选举成功后 AppendEntries 请求参数 返回值 存储日志 ...

  5. 一致性协议raft详解(二):安全性

    一致性协议raft详解(二):安全性 前言 安全性 log recovery 为什么no-op能解决不一致的问题? 成员变更 Single mempership change raft用到的随机时间 ...

  6. 一致性协议raft详解(一):raft整体介绍

    一致性协议raft详解(一):raft介绍 前言 概述 raft独特的特性 raft集群的特点 raft中commit何意? raft leader election log replication ...

  7. Memcache的使用和协议分析详解

    Memcache的使用和协议分析详解 作者:heiyeluren 博客:http://blog.csdn.net/heiyeshuwu 时间:2006-11-12 关键字:PHP Memcache L ...

  8. IPv6邻居发现协议--NDP详解

    一.ICMPv6 -Internet控制报文协议 ICMPv6是IPV6的基础协议之一,用于向源节点传递报文转发的信息或错误 协议类型号(即:IPv6Next Header)为58 icmpv6可以提 ...

  9. HTTP响应协议格式详解

    文章目录 响应协议格式 1. 首行 状态码详解 2. 响应头header 响应协议格式 HTTP请求协议由首行.响应头(header).空行.正文(body)组成.通过空行来区别header和body ...

最新文章

  1. 安谋中国推出“山海” S12,AIoT 安全解决方案技术全解读
  2. c# winform 关于给静态全局变量赋值的问题
  3. [置顶]       Javascript js中页面的重新加载
  4. Redux vs Mobx系列(-):immutable vs mutable
  5. 临床研究中的基因组学、药物基因组学、蛋白质组学和转录组学 Omics in Clinical Practice: Genomics, Pharmacogenomics, Proteomics, and
  6. MongoDB(一)-- 简介、安装、CRUD
  7. 4.4GDI基本图形
  8. php foreach 多出一个_PHP如何实现统计数据合并
  9. Android如何计算时间差
  10. 如何把电视盒子做成游戏机? —— 破解电视IPTV盒子(Skyworth E900-S)
  11. 英语单词 One 个人 5. 身体动作
  12. 0704最简单的驱动hello
  13. 前后端报文传输加密方案
  14. 仪表板 ajax实例,CQD 开发示例 - Skype for Business Server 2015 | Microsoft Docs
  15. 以太网(802.3)帧格式
  16. ASO优化之AppStore规则介绍
  17. 【BLE】蓝牙Profile
  18. 视频压缩编码和解码(转)
  19. 邵柏庆与Ace Lead Profits Ltd.在英属维尔京群岛针对和利时自动化科技有限公司提起诉讼
  20. LeetCode(数据库)- 统计各专业学生人数

热门文章

  1. 【操作系统】第一章.操作系统引论思维导图
  2. 【操作系统】输入输出系统(下下)-思维导图0.0
  3. 【离散数学】单向连通和弱连通的区别
  4. linux入门怎么学?
  5. SQL 难点解决:直观分组
  6. VRAR应该是工具,而不是“玩具”
  7. 导出excel 文件
  8. C4-Squid-Purge
  9. 开源 ERP 软件 Odoo 提速指南
  10. About Wisdom