小程序websocket心跳庫(websocket-heartbeat-miniprogram)
前言
在16年的時(shí)候因?yàn)轫?xiàng)目接觸到websocket,而后對心跳重連做了一次總結(jié),寫了篇博客,而后18年對之前github上的demo代碼進(jìn)行了再次開發(fā)和開源,最終封裝成庫。如下:
github: https://github.com/zimv/websocket-heartbeat-js
npm: https://www.npmjs.com/package/websocket-heartbeat-js
在2020年也就是今年初,同事建議說可以考慮兼容一下小程序,心想也挺好的。便有了今天的 websocket-heartbeat-miniprogram,這次基于以前的代碼新建了一個(gè)項(xiàng)目,只做小程序的版本,因?yàn)樯婕暗礁鞣N小程序以及相關(guān)框架的兼容,覺得還是單獨(dú)出一個(gè)包,更專注一點(diǎn)。
介紹
websocket-heartbeat-miniprogram基于小程序的websocket相關(guān)API進(jìn)行封裝,主要目的是保障客戶端websocket與服務(wù)端連接狀態(tài)。該程序有心跳檢測及自動(dòng)重連機(jī)制,當(dāng)網(wǎng)絡(luò)斷開或者后端服務(wù)問題造成客戶端websocket斷開,程序會(huì)自動(dòng)嘗試重新連接直到再次連接成功。兼容市面上大部分小程序微信,百度,支付寶等,只要都是統(tǒng)一的小程序weboscket-API規(guī)范。也支持小程序框架比如Taro等。無論如何,業(yè)務(wù)是需要一層心跳機(jī)制的,否則一些情況下會(huì)丟失連接導(dǎo)致功能無法使用。
用法
安裝
npm install --save websocket-heartbeat-miniprogram
引入使用
import WebsocketHeartbeat from 'websocket-heartbeat-miniprogram';
WebsocketHeartbeat({
miniprogram: wx,
connectSocketParams: {
url: 'ws://xxx'
}
})
.then(task => {
task.onOpen = () => {//鉤子函數(shù)
console.log('open');
};
task.onClose = () => {//鉤子函數(shù)
console.log('close');
};
task.onError = e => {//鉤子函數(shù)
console.log('onError:', e);
};
task.onMessage = data => {//鉤子函數(shù)
console.log('onMessage', data);
};
task.onReconnect = () => {//鉤子函數(shù)
console.log('reconnect...');
};
task.socketTask.onOpen(data => {//原生實(shí)例注冊函數(shù),重連后丟失
console.log('socketTask open');
});
task.socketTask.onMessage(data => {//原生實(shí)例注冊函數(shù),重連后丟失
console.log('socketTask data');
});
})
本程序內(nèi)部總是使用小程序connectSocket方法進(jìn)行socket連接,如果socket斷開,本程序內(nèi)部會(huì)再次執(zhí)行小程序的connectSocket方法,以此來重新建立連接,重連都會(huì)建立新的小程序socket實(shí)例。
WebsocketHeartbeat方法返回一個(gè)promise,返回的task對象是本程序的一個(gè)實(shí)例,提供了onOpen,onClose,onError,onMessage,onReconnect等鉤子函數(shù)。也暴露了小程序本身的實(shí)例(socketTask),task.socketTask就是小程序connectSocket返回的實(shí)例,而task.socketTask是小程序的原生實(shí)例,它們通過onXXX方法傳遞函數(shù)進(jìn)行監(jiān)聽注冊,在socket重連以后,內(nèi)部重新通過connectSocket新建實(shí)例,將會(huì)返回新的小程序原生實(shí)例,因此之前通過socketTask.onXXX注冊的這些函數(shù)將會(huì)丟失。而本程序內(nèi)部提供的鉤子函數(shù)重連上以后依然有效。大部分情況下推薦就使用本程序的鉤子函數(shù)。
支付寶小程序差異
支付寶小程序只允許同時(shí)存在一個(gè)socket連接,原生的API也和其他小程序有一點(diǎn)小差異,本程序已經(jīng)做了兼容,但是還是要注意支付寶只允許建立一個(gè)socket,如果建立多個(gè)socket,前面的socket都會(huì)被系統(tǒng)關(guān)閉,一定要通過本程序?qū)嵗膖ask.close關(guān)閉舊的socket,否則程序會(huì)一直重連,導(dǎo)致所有socket相互沖突無法使用。
約定
1.只能通過前端主動(dòng)關(guān)閉socket連接
如果需要斷開socket,應(yīng)該執(zhí)行task.close()方法。如果后端想要關(guān)閉socket,應(yīng)該下發(fā)一個(gè)消息,前端判斷此消息,前端再調(diào)用task.close()方法關(guān)閉。因?yàn)闊o論是后端調(diào)用close還是因?yàn)槠渌蛟斐傻膕ocket關(guān)閉,前端的socket都會(huì)觸發(fā)onClose事件,程序無法判斷是什么原因?qū)е碌年P(guān)閉。因此本程序會(huì)默認(rèn)嘗試重連。
import WebsocketHeartbeat from 'websocket-heartbeat-miniprogram';
WebsocketHeartbeat({
miniprogram: wx,
connectSocketParams: {
url: 'ws://xxxx'
}
})
.then(task => {
task.onMessage = data => {
if(data.data == 'close') task.close();//關(guān)閉socket并且,不再重連
};
})
2.后端對前端心跳的反饋
前端發(fā)送心跳消息,后端收到后,需要立刻返回響應(yīng)消息,后端響應(yīng)的消息可以是任何值,因?yàn)楸境绦虿⒉惶幚砗团袛囗憫?yīng)的心跳消息,而只是在收到任何消息后,重置心跳,因?yàn)槭盏饺魏蜗⒕驼f明連接是正常的。因此本程序收到任何后端返回的消息都會(huì)重置心跳倒計(jì)時(shí),以此來減少不必要的請求,減少服務(wù)器壓力。
API
詳情參考: https://github.com/zimv/websocket-heartbeat-miniprogram
結(jié)語
程序已經(jīng)經(jīng)過單元測試,也在百度,支付寶,微信等小程序之中實(shí)際測試和基于Taro測試。程序長期維護(hù),發(fā)現(xiàn)兼容問題或者程序問題,希望得到issue反饋!
到此這篇關(guān)于小程序websocket心跳庫(websocket-heartbeat-miniprogram)的文章就介紹到這了,更多相關(guān)小程序websocket心跳庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 微信小程序webSocket的使用方法
- 微信小程序使用websocket通訊的demo,含前后端代碼,親測可用
- java與微信小程序?qū)崿F(xiàn)websocket長連接
- 微信小程序websocket實(shí)現(xiàn)即時(shí)聊天功能
- 微信小程序websocket聊天室的實(shí)現(xiàn)示例代碼
- 詳解微信小程序?qū)崿F(xiàn)WebSocket心跳重連
- 微信小程序websocket實(shí)現(xiàn)聊天功能
- 微信小程序WebSocket實(shí)現(xiàn)聊天對話功能
- 微信小程序?qū)崟r(shí)聊天WebSocket
- 微信小程序 websocket 實(shí)現(xiàn)SpringMVC+Spring+Mybatis
- 微信小程序 WebSocket詳解及應(yīng)用
- 微信小程序 網(wǎng)絡(luò)API Websocket詳解
相關(guān)文章
JS上傳圖片前的限制包括(jpg jpg gif及大小高寬)等
文件上傳之前的檢測,通常是通過文件名來判斷文件類型是否合法,但是要想檢測文件的大小很難辦到,除非在本地或者使用控件。使用JS可以輕松解決詞問題,js在上傳圖片前判斷大小 這個(gè)可以用javascript實(shí)現(xiàn),效果2012-12-12
對javascript的一點(diǎn)點(diǎn)認(rèn)識(shí)總結(jié)《javascript高級(jí)程序設(shè)計(jì)》讀書筆記
Javascript專為與網(wǎng)頁交互而設(shè)計(jì)的腳本語言,由下列三個(gè)部門構(gòu)造2011-11-11
js open() 與showModalDialog()方法使用介紹
項(xiàng)目開發(fā)中經(jīng)常要用到j(luò)s open() 與showModalDialog()方法,下面有個(gè)不錯(cuò)的示例,喜歡的朋友可以研究下2013-09-09
用JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲
這篇文章主要為大家詳細(xì)介紹了用JS實(shí)現(xiàn)飛機(jī)大戰(zhàn)小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06
js實(shí)現(xiàn)可控制左右方向的無縫滾動(dòng)效果
這篇文章主要介紹了js實(shí)現(xiàn)可控制左右方向的無縫滾動(dòng)效果,頁面中添加了兩個(gè)按鈕,控制圖片滾動(dòng)的方向,感興趣的小伙伴們可以參考一下2016-05-05
iframe窗口高度自適應(yīng)的實(shí)現(xiàn)方法
這篇文章主要介紹了iframe窗口高度自適應(yīng)的實(shí)現(xiàn)方法,有需要的朋友可以參考一下2014-01-01
javascript使用isNaN()函數(shù)判斷變量是否為數(shù)字
javascript中判斷變量是否為數(shù)字的方法,這里主要介紹javascript里的 isNaN() 函數(shù),具體使用如下,感興趣的朋友可以參考下2013-09-09

