亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

在Node.js下運用MQTT協(xié)議實現(xiàn)即時通訊及離線推送的方法

 更新時間:2019年01月24日 09:29:24   作者:青荼  
這篇文章主要介紹了在Node.js下運用MQTT協(xié)議實現(xiàn)即時通訊及離線推送的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

前言

前些日子了解到mqtt這樣一個協(xié)議,可以在web上達到即時通訊的效果,但網(wǎng)上并不能很方便地找到一篇目前版本的在node下正確實現(xiàn)這個協(xié)議的博客。

自己搗鼓了一段時間,理解不深刻,但也算是基本能夠達到使用目的。

本文尚未對離線消息的接收順序進行處理。

代碼

服務端: server.js

//服務端引入中間件mosca
let mosca = require('mosca')
let settings = {
 port: 5112
}
let server = new mosca.Server(settings)
server.on('ready', function(){
  console.log('Mosca server is up and running at port 5112'); 
})
server.on('published', function(packet, client) {
 console.log('Published', packet.payload)
})

server.on('clientDisconnected', function(client){
 console.log('disconnected: ', client.id)
})

推送端: pub.js

//客戶端引入mqtt
let mqtt = require('mqtt');

let client = mqtt.connect('mqtt://localhost', {
 port: 5112,
 clientId: 'cli_pub',
})

let num = 0;
setInterval(function (){
 client.publish('test', 
 'Hello mqtt ' + (++num),
 {qos:1},
 () => console.log(num));
}, 1000)

訂閱端: sub.js

let mqtt = require('mqtt')

let client = mqtt.connect('mqtt://localhost', {
 port: 5112,
 clientId: 'cli_sub',
})

client.subscribe('test',{qos:1})

client.on('message', function (topic, message) {
 console.log('received message: ', message.toString())
})

server運行后,先啟動pub,再啟動sub,即可在sub中接收到推送過來的消息序列

至此實現(xiàn)了簡單的即時推送

離線推送相關配置及簡要介紹

離線配置-服務端:

要實現(xiàn)消息的離線推送,必然需要一個存儲臨時數(shù)據(jù)的部件

此處用到的是mongo,當然可以根據(jù)需要選擇其他的存儲工具

server.js中的settings需更改為:

let settings = {
 port: 5112,
 persistence:{  //增加了此項
  factory: mosca.persistence.Mongo,
  url: "mongodb://localhost:27017/mosca"
 }
}

factory: 引入mosca對特定存儲工具的一些處理方法

url: 其中的 27017 為mongo所監(jiān)聽的端口號,mosca為存儲相關數(shù)據(jù)的數(shù)據(jù)庫

值得一提的是:配置好mongo的環(huán)境后,不需要提前在mongo中手動創(chuàng)建,若數(shù)據(jù)庫不存在會自動生成,而且mosca會為你作好其他一切基本事項 (即:若只想臨時體驗下效果,甚至可以暫時把mongo放一邊 )

在mongo中,可以看到自動新添了db: mosca及其下的collection(相當于關系型數(shù)據(jù)庫中的表/關系)

離線配置-客戶端:

pub.js和sub.js中的client中都可以改為:

let client = mqtt.connect('mqtt://localhost', {
 port: 5112,
 clientId: 'cli_**',
 clean: false//增加了此項
})
  • clientId: 區(qū)分客戶端的識別碼
  • clean: 此處決定了客戶端在服務端的session是否會被清除,默認為true,為實現(xiàn)離線推送,我們需要將其保留
  • clean及上文中的persistence為實現(xiàn)離線推送的關鍵配置

mqtt.connect()會返回一個mqttClient對象,包含了:reconnect(), subscribe(), publish()等一系列方法。

本文中發(fā)送端接收端被分為了pub.js和sub.js兩個獨立文件,僅僅為了方便在不同控制臺中觀察效果
一個client可以既為推送端,又為訂閱端

至此,所有代碼已完成

其他介紹:

client.subscribe():
為本客戶端訂閱一個話題,所有訂閱此話題的用戶都會收到在此話題下推送的信息

//client.subscribe(topic,opts)
client.subscribe('test',{qos:1})

opts中的qos為通信機制,控制發(fā)送端與接收端的互鎖程度

上文中的其中一個collection: subscriptions即記錄各用戶話題訂閱情況

用戶cli_sub及cli2_sub訂閱了話題test:


(新增一個cli2_pub,下文有用)

注:

重復執(zhí)行腳本sub.js實際上對topic進行了重復訂閱

實際編碼時,應避免topic的重復訂閱,即使重復訂閱并不影響實現(xiàn)效果

client.publish():

向指定topic發(fā)送數(shù)據(jù)

message為Buffer或String格式,可以通過序列化或轉json實現(xiàn)對復雜數(shù)據(jù)對象的傳送

//client.publish(topic, message, opts, callback)
let num = 0;
setInterval(function (){
 client.publish('test', 
 'Hello mqtt ' + (++num),
 {qos:1},
 () => console.log(num));
}, 1000)

參數(shù)不再贅述

此處用一個定時器定時在 topic: test 下發(fā)送'Hello mqtt 1,2,3..'

用回調函數(shù)實時打印一下發(fā)送的num:

當訂閱者處于離線狀態(tài)時,可以在collection: packets中查看到臨時數(shù)據(jù)的存儲情況:


mosca把每一條推送消息為所有訂閱用戶都生成了獨立的記錄,用同一個messageId進行關聯(lián)

當其中一個用戶(cli2_sub)上線時,獲取到其對應的數(shù)據(jù),


而后數(shù)據(jù)庫中相應記錄便會被刪除


此時僅有cli_sub用戶的數(shù)據(jù)

當cli2_sub上線接收消息后,packets中記錄將被清空

client.on():

即在client上觸發(fā)的事件,此處只列舉消息接收事件

//client.on(event, callback)
client.on('message', function (topic, message) {
 console.log('received message: ', message.toString())
})

處理為簡單地打印到控制臺

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • koa框架的原理、功能,與基本使用方法概述

    koa框架的原理、功能,與基本使用方法概述

    這篇文章主要介紹了koa框架的原理、功能,與基本使用方法,結合實例形式分析了koa框架的基本功能、原理、使用方法與相關注意事項,需要的朋友可以參考下
    2023-04-04
  • 剖析Node.js異步編程中的回調與代碼設計模式

    剖析Node.js異步編程中的回調與代碼設計模式

    這篇文章主要介紹了Node.js異步編程中的回調與代碼設計模式,雖然大多數(shù)場合回調編寫時的長串括號不怎么好看,但Node的異步性能確實很好,需要的朋友可以參考下
    2016-02-02
  • 如何用npm命令刪除開發(fā)項目中的node_modules文件夾

    如何用npm命令刪除開發(fā)項目中的node_modules文件夾

    每個項目都會產(chǎn)生一個node_modules,每個node_modules少則幾十兆,多則幾百甚至上千兆,隨著時間的積累,維護項目的增加,整個項目目錄體積會越來越大,這篇文章主要給大家介紹了關于如何用npm命令刪除開發(fā)項目中的node_modules文件夾,需要的朋友可以參考下
    2023-12-12
  • node實現(xiàn)socket鏈接與GPRS進行通信的方法

    node實現(xiàn)socket鏈接與GPRS進行通信的方法

    這篇文章主要介紹了node實現(xiàn)socket鏈接與GPRS進行通信的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-05-05
  • Express實現(xiàn)Session身份認證的示例代碼

    Express實現(xiàn)Session身份認證的示例代碼

    本文主要介紹了Express實現(xiàn)Session身份認證的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01
  • Node.js版本升級如何修改模塊默認的保存位置

    Node.js版本升級如何修改模塊默認的保存位置

    這篇文章主要給大家介紹了關于Node.js版本升級如何修改模塊默認的保存位置,文中通過代碼以及圖文介紹的非常詳細,對大家學習或者使用node.js具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-05-05
  • 使用nodejs分離html文件里的js和css詳解

    使用nodejs分離html文件里的js和css詳解

    在本篇文章里小編給大家分享了關于如何使用nodejs分離html文件里的js和css的相關知識點,需要的朋友參考下。
    2019-04-04
  • 詳解nodejs操作mongodb數(shù)據(jù)庫封裝DB類

    詳解nodejs操作mongodb數(shù)據(jù)庫封裝DB類

    這篇文章主要介紹了詳解nodejs操作mongodb數(shù)據(jù)庫封裝DB類,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Node.js實現(xiàn)爬取網(wǎng)站圖片的示例代碼

    Node.js實現(xiàn)爬取網(wǎng)站圖片的示例代碼

    本文將利用Node.js開發(fā)一個小示例—爬取某圖片網(wǎng)站的圖片,文中涉及的知識點有https模塊、cheerio模塊、fs模塊和閉包,感興趣的可以了解一下
    2022-04-04
  • 利用Decorator如何控制Koa路由詳解

    利用Decorator如何控制Koa路由詳解

    最近學習了plover的底層框架koa,所以下面這篇文章主要給大家介紹了關于利用Decorator如何控制Koa路由的相關資料,,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面來隨著小編一起學習學習吧
    2018-06-06

最新評論