本示例借助meteor的一个环境跑,和咱们平时用的node本身搭的环境或java,php的环境本质同样,在此很少讨论。php
首先需求是:多系统对接进行消息实时传递。java
安装好mqtt: npm install mqtt --savenode
本地服务(能够直接配在java中):这里采用moscaweb
安装好mosca: npm install mosca --savenpm
var mosca=reqire('mosca'); var mqttServer=new mosca.Server({port:8000}); //设置监听端口 //published监听所发布的消息 mqttServer.on('published',function(packet,client){ console.log('published----',packet); switch(packet.topic){ //topic字段是消息主题,能够理解为接口中的方法名 case 'test': //不一样的订阅主题,发布消息不一样 console.log(packet.payload.toString()); mqttServer.publish({topic:'other',payload:'测试不一样主题!'}); break; case 'other': console.log(packet.paload.toString()); break; } });
//服务开启时给个提示: mqttServer.on('ready',function(){ console.log('Mosca server is running ... '); });
订阅消息(接收): 服务器
var mqtt=require('mqtt'); var client=mqtt.connect('tcp://172.19.5.217:8000'); //本地创建链接 //模拟一个消息发送 var msg={talk:'this is test!!',name:'测试'}; //轮洵发送,仅作测试用,实际场景不须要轮洵 setInterval(function(){ client.publish('test',JSON.stringify(msg),{qos:1,retain:true}); //发布一条主题为test的消息, },60000); client.subscribe('test'); //订阅主题为test的消息 client.on('message',function(topic,message){ var result=JSON.parse(message.toString()); //接收到新消息,并对其进行处理 try{ console.log('result---->',result); //****do something **** }catch(e){ console.log('error---->',result); } })
publish()方法接收四个参数publish(topic,message,[options],[callback]);websocket
topic: 消息主题;网络
message:传递的消息;socket
options:指定参数值:qos :服务质量级别,默认为0 (消息最多发送一次,无论是否接收到)tcp
retain:默认为false,推送至当前订阅就释放这条消息。设为true,表示服务器要保留此次推送的信息,若是新的订阅者出现,就把这条消息推送给它。
dup:保证消息可靠传输,默认为false,只占用一个字节,表示第一次发送。不能用于检测消息重复发送等。注意须要知足如下条件:
1.当QoS > 0,即消息至少传递一次)
2.消息须要回复确认。
此时,在可变头部须要包含消息ID(即client.id)。当值为1时,表示当前消息先前已经被传送过。
这样一个简单的消息监听功能就作好了,我这边是作一个接收消息自动发送功能,效果以下:
因为我作即时聊天有用到websocket,与mqtt都是与服务器保持长链接,进行消息传递。那么,来对比一下MQTT和WebSocket有什么区别?
MQTT具有如下特色:
1.采用发布/订阅消息传输协议,设计思想开放,简单,轻量。
2.网络代码高,比较依赖网络。
3.有三种服务质量:至多一次,只有一次,至少一次。前二者会有风险,后者会负载太重。
WebSocket的不一样在于:
1.提供使用一个TCP链接进行双向通信机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通信。
2.借用HTTP和HTTPS端口,与TCP创建链接和关闭链接时握手。传输消息采用TCP协议。
具体应用时,咱们只须要根据实现场景及二者的特色,选择更合适的通信方式便可。