本示例藉助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協議。
具體應用時,咱們只須要根據實現場景及二者的特色,選擇更合適的通信方式便可。