本示例借助meteor的一個環境跑,和我們平時用的node自己搭的環境或java,php的環境本質一樣,在此不多討論。
首先需求是:多系統對接進行消息實時傳遞。
安裝好mqtt: npm install mqtt --save
本地服務(可以直接配在java中):這里采用mosca
安裝好mosca: npm install mosca --save
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]);
topic: 消息主題;
message:傳遞的消息;
options:指定參數值:qos :服務質量級別,默認為0 (消息最多發送一次,不管是否接收到)
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協議。
具體應用時,我們只需要根據實現場景及兩者的特點,選擇更合適的通訊方式即可。