欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

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

本文尚未對離線消息的接收順序進(jìn)行處理。

代碼

服務(wù)端: server.js

//服務(wù)端引入中間件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運(yùn)行后,先啟動pub,再啟動sub,即可在sub中接收到推送過來的消息序列

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

離線推送相關(guān)配置及簡要介紹

離線配置-服務(wù)端:

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

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

server.js中的settings需更改為:

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

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

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

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

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

離線配置-客戶端:

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

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

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

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

至此,所有代碼已完成

其他介紹:

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

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

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

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

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


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

注:

重復(fù)執(zhí)行腳本sub.js實(shí)際上對topic進(jìn)行了重復(fù)訂閱

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

client.publish():

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

message為Buffer或String格式,可以通過序列化或轉(zhuǎn)json實(shí)現(xiàn)對復(fù)雜數(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ù)不再贅述

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

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

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


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

當(dāng)其中一個(gè)用戶(cli2_sub)上線時(shí),獲取到其對應(yīng)的數(shù)據(jù),


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


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

當(dāng)cli2_sub上線接收消息后,packets中記錄將被清空

client.on():

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

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Node.js使用Streams來處理文件讀寫操作的示例代碼

    Node.js使用Streams來處理文件讀寫操作的示例代碼

    在Node.js中,Streams 提供了一種高效的方式來處理文件的讀寫操作,特別是對于大文件或數(shù)據(jù)流,Streams 允許你以流的方式讀寫數(shù)據(jù),這意味著數(shù)據(jù)可以分塊處理,本文介紹了在Node.js中如何使用Streams來處理文件讀寫操作,需要的朋友可以參考下
    2024-09-09
  • nodejs實(shí)例解析(輸出hello world)

    nodejs實(shí)例解析(輸出hello world)

    本文主要介紹nodejs實(shí)例解析:輸出hello world的完整過程。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • Node.js包管理器Yarn的入門介紹與安裝

    Node.js包管理器Yarn的入門介紹與安裝

    大家都知道在yarn發(fā)布之前,所有Nodejs開發(fā)者用的都是npm包管理工具,而npm工具存在挺多難以忍受的詬病,包括安裝速度慢、每次都要在線重新安裝等問題,而yarn也是為了解決npm當(dāng)前所存在的問題而出現(xiàn)的。本文給大家介紹了包管理器Yarn,以及安裝方法。下面來一起看看。
    2016-10-10
  • Node.js如何優(yōu)雅的封裝一個(gè)實(shí)用函數(shù)的npm包的方法

    Node.js如何優(yōu)雅的封裝一個(gè)實(shí)用函數(shù)的npm包的方法

    這篇文章主要介紹了Node.js如何優(yōu)雅的封裝一個(gè)實(shí)用函數(shù)的npm包的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 詳解NODEJS的http實(shí)現(xiàn)

    詳解NODEJS的http實(shí)現(xiàn)

    這篇文章主要介紹了詳解NODEJS的http實(shí)現(xiàn)的技術(shù)過程以及詳細(xì)分析,需要的朋友學(xué)習(xí)參考下吧。
    2018-01-01
  • 在Node.js應(yīng)用中讀寫Redis數(shù)據(jù)庫的簡單方法

    在Node.js應(yīng)用中讀寫Redis數(shù)據(jù)庫的簡單方法

    這篇文章主要介紹了在Node.js應(yīng)用中讀寫Redis數(shù)據(jù)庫的簡單方法,Redis是一個(gè)內(nèi)存式高速數(shù)據(jù)庫,需要的朋友可以參考下
    2015-06-06
  • Yarn的安裝與使用詳細(xì)介紹

    Yarn的安裝與使用詳細(xì)介紹

    不知道大家有沒有覺察到Facebook近年大招頻出。Yarn是Facebook最近發(fā)布的一款依賴包安裝工具。Yarn是一個(gè)新的快速安全可信賴的可以替代NPM的依賴管理工具,Yarn正式發(fā)布沒幾天已經(jīng)迅速達(dá)到了數(shù)萬贊,就可以知道大家苦NPM久已。這篇文章將詳細(xì)介紹Yarn的安裝與使用。
    2016-10-10
  • 使用Meteor配合Node.js編寫實(shí)時(shí)聊天應(yīng)用的范例

    使用Meteor配合Node.js編寫實(shí)時(shí)聊天應(yīng)用的范例

    這篇文章主要介紹了使用Meteor配合Node.js編寫實(shí)時(shí)聊天應(yīng)用的范例,Node.js作為異步框架,其最突出的使用便是用來編寫實(shí)時(shí)應(yīng)用程序,需要的朋友可以參考下
    2015-06-06
  • Lua表達(dá)式和控制結(jié)構(gòu)學(xué)習(xí)筆記

    Lua表達(dá)式和控制結(jié)構(gòu)學(xué)習(xí)筆記

    這篇文章主要介紹了Lua表達(dá)式和控制結(jié)構(gòu)學(xué)習(xí)筆記,本文講解了算術(shù)操作符、關(guān)系操作符、邏輯操作符、局部變量與作用域、控制結(jié)構(gòu)等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • Nodejs使用express 編寫接口的實(shí)現(xiàn)

    Nodejs使用express 編寫接口的實(shí)現(xiàn)

    express是一個(gè)第三方模塊,支持豐富的api,本文主要介紹了Nodejs使用express 編寫接口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06

最新評論