websocket-heartbeat-js心跳檢測庫正式釋出
前言:
兩年前寫了一篇websocket心跳的部落格——。 閱讀量一直比較大,加上最近考慮寫一個自己的npm包,因此就完成了一個websocket心跳的檢測庫。在這裡先感謝幾個提供幫助的大佬朋友們,小弟受益匪淺。
介紹
websocket-heartbeat-js基於瀏覽器js原生websocket封裝,主要目的是保障客戶端websocket與服務端連線狀態。該程式有心跳檢測及自動重連機制,當網路斷開或者後端服務問題造成客戶端websocket斷開,程式會自動嘗試重新連線直到再次連線成功。
在使用原生websocket的時候,如果裝置網路斷開,不會觸發任何函式,前端程式無法得知當前連線已經斷開。這個時候如果呼叫websocket.send方法,瀏覽器就會發現訊息發不出去,便會立刻或者一定短時間後(不同瀏覽器或者瀏覽器版本可能表現不同)觸發onclose函式。
後端websocket服務也可能出現異常,連線斷開後前端也並沒有收到通知,因此需要前端定時傳送心跳訊息ping,後端收到ping型別的訊息,立馬返回pong訊息,告知前端連線正常。如果一定時間沒收到pong訊息,就說明連線不正常,前端便會執行重連。
為了解決以上兩個問題,以前端作為主動方,定時傳送ping訊息,用於檢測網路和前後端連線問題。一旦發現異常,前端持續執行重連邏輯,直到重連成功。
1.關閉websocket連線
如果需要斷開websocket,應該執行WebsocketHeartbeatJs.close(),WebsocketHeartbeatJs.ws是原生Websocket例項物件,WebsocketHeartbeatJs.ws.onclose,已經被繫結了重連方法,如果後端websocket服務直接關閉連線,前端WebsocketHeartbeatJs.ws.onclose會被執行,WebsocketHeartbeatJs會嘗試重連。如果後端想告訴前端需要斷開連線,需要傳送特定訊息給前端,前端收到特定訊息,呼叫WebsocketHeartbeatJs.close(),WebsocketHeartbeatJs將不會重連。
websocketHeartbeatJs.onmessage = (e) => { if(e.data == 'close') websocketHeartbeatJs.close(); }
2.ping & pong
前端傳送ping訊息,後端收到後,需要立刻返回pong訊息,pong訊息可以是任何值,websocket-heartbeat-js並不處理pong訊息,而只是在收到任何訊息後,重置心跳,因為收到任何訊息就說明連線是正常的。
npm install websocket-heartbeat-js
import WebsocketHeartbeatJs from 'websocket-heartbeat-js'; let websocketHeartbeatJs = new WebsocketHeartbeatJs({ url: 'ws://xxxxxxx' }); websocketHeartbeatJs.onopen = function () { console.log('connect success'); websocketHeartbeatJs.send('hello server'); } websocketHeartbeatJs.onmessage = function (e) { console.log(`onmessage: ${e.data}`); } websocketHeartbeatJs.onreconnect = function () { console.log('reconnecting...'); }
<script class="lazyload" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsQAAA7EAZUrDhsAAAANSURBVBhXYzh8+PB/AAffA0nNPuCLAAAAAElFTkSuQmCC" data-original="./node_modules/websocket-heartbeat-js/dist/index.js"></script> let websocketHeartbeatJs = new window.WebsocketHeartbeatJs({ url: 'ws://xxxxxxx' });
websocket-heartbeat-js僅僅是封裝了心跳相關的鉤子函式,websocketHeartbeatJs.ws是原生Websocket例項,如需要使用更多websocket特性,請直接操作websocketHeartbeatJs.ws。
websocketHeartbeatJs.ws 等於 WebSocket(websocketHeartbeatJs.opts.url);
屬性 | 必填 | 型別 | 預設值 | 描述 |
---|---|---|---|---|
url | true | string | none | websocket服務端介面地址 |
pingTimeout | false | number | 15000 | 每隔15秒傳送一次心跳,如果收到任何後端訊息定時器將會重置 |
pongTimeout | false | number | 10000 | ping訊息傳送之後,10秒內沒收到後端訊息便會認為連線斷開 |
reconnectTimeout | false | number | 2000 | 嘗試重連的間隔時間 |
pingMsg | false | string | "heartbeat" | ping訊息值 |
const options = {
url: 'ws://xxxx',
pingTimeout: 15000,
pongTimeout: 10000,
reconnectTimeout: 2000,
pingMsg: "heartbeat"
}
let websocketHeartbeatJs = new WebsocketHeartbeatJs(options);
傳送訊息給後端
websocketHeartbeatJs.send('hello server');
前端手動斷開websocket連線,此方法不會觸發重連。 websocketHeartbeatJs.close()
websocketHeartbeatJs.onclose = () => { console.log('connect close'); }
websocketHeartbeatJs. = () => { console.log('connect '); }
websocketHeartbeatJs.onopen = () => { console.log('open success'); }
websocketHeartbeatJs.onmessage = (e) => { console.log('msg:', e.data); }
websocketHeartbeatJs.onreconnect = (e) => { console.log('reconnecting...'); }
地址:https://www.cnblogs.com/1wen/p/9789260.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1795/viewspace-2818560/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 心跳檢測機制
- Flutter Http庫Dio 2.1正式釋出FlutterHTTP
- OpenAI正式釋出第一個官方.NET版本庫的測試版OpenAI
- 映象規範檢測工具釋出
- Flutter http請求庫dio 1.0正式釋出FlutterHTTP
- Spring Boot Admin使用及心跳檢測原理Spring Boot
- MIT高科技:WIFI可檢測呼吸和心跳MITWiFi
- 時序資料庫 TDengine 3.0.2.0 版本正式釋出資料庫
- 【開源框架】SqlSugarRepository 全庫ORM 正式釋出框架SqlSugarORM
- 不止於觀測|阿里雲可觀測套件正式釋出阿里套件
- Fedora 31 正式釋出
- .NET 8正式釋出
- Flutter 2.8 正式釋出Flutter
- Dart 2.17 正式釋出Dart
- Flutter 3.7 正式釋出Flutter
- NutUI 4.0 正式釋出!UI
- OpenCV 4.5.1正式釋出!OpenCV
- ?? webpack 3: 正式釋出!! ??Web
- CentOS 6.5 正式釋出CentOS
- PyCharm 4 正式釋出!PyCharm
- Rust 1.0 正式釋出Rust
- Fedora 24 正式釋出!
- Seam 2.0正式釋出
- KDE 5.6 正式釋出
- Java 22 正式釋出Java
- OpenAtom OpenHarmony三方庫建立釋出及安全隱私檢測
- 星海後臺測試平臺社群版正式釋出
- Windows 7 硬體徽標測試工具正式釋出Windows
- WPS for Linux beta1 正式釋出公測Linux
- GreatSQL TPC-H 效能測試報告正式釋出!SQL測試報告
- 專為webkit核心而生的javascript庫mango正式釋出WebKitJavaScriptGo
- 谷歌 Chrome 94 穩定版正式釋出:預設啟用空閒檢測 API 引爭議谷歌ChromeAPI
- Kotlin 1.3.70正式釋出Kotlin
- Blazor WebAssembly 3.2 正式釋出BlazorWeb
- DragonFlyBSD 5.4.3 正式釋出Go
- Kotlin 1.3.40正式釋出Kotlin
- Bootstrap4 正式釋出boot
- 〔譯〕TypeScript 2.0 正式釋出TypeScript