websocket-heartbeat-js 心跳检测库正式发布
前言:
两年前写了一篇websocket心跳的博客——初探和实现websocket心跳重连。 阅读量一直比较大,加上最近考虑写一个自己的npm包,因此就完成了一个websocket心跳的检测库。在这里先感谢几个提供帮助的大佬朋友们,小弟受益匪浅。
介绍
websocket-heartbeat-js基于浏览器js原生websocket封装,主要目的是保障客户端websocket与服务端连接状态。该程序有心跳检测及自动重连机制,当网络断开或者后端服务问题造成客户端websocket断开,程序会自动尝试重新连接直到再次连接成功。
原理
在使用原生websocket的时候,如果设备网络断开,不会触发任何函数,前端程序无法得知当前连接已经断开。这个时候如果调用websocket.send方法,浏览器就会发现消息发不出去,便会立刻或者一定短时间后(不同浏览器或者浏览器版本可能表现不同)触发onclose函数。
后端websocket服务也可能出现异常,连接断开后前端也并没有收到通知,因此需要前端定时发送心跳消息ping,后端收到ping类型的消息,立马返回pong消息,告知前端连接正常。如果一定时间没收到pong消息,就说明连接不正常,前端便会执行重连。
为了解决以上两个问题,以前端作为主动方,定时发送ping消息,用于检测网络和前后端连接问题。一旦发现异常,前端持续执行重连逻辑,直到重连成功。
约定
如果需要断开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();
}
前端发送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 src="./node_modules/websocket-heartbeat-js/dist/index.js"></script>
let websocketHeartbeatJs = new window.WebsocketHeartbeatJs({
url: 'ws://xxxxxxx'
});
API
websocketHeartbeatJs.ws (WebSocket)
websocket-heartbeat-js仅仅是封装了心跳相关的钩子函数,websocketHeartbeatJs.ws是原生Websocket实例,如需要使用更多websocket特性,请直接操作websocketHeartbeatJs.ws。
websocketHeartbeatJs.ws 等于 WebSocket(websocketHeartbeatJs.opts.url);
websocketHeartbeatJs.opts (Object)
属性 | 必填 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
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(msg) (function)
发送消息给后端
websocketHeartbeatJs.send('hello server');
websocketHeartbeatJs.close() (function)
前端手动断开websocket连接,此方法不会触发重连。 websocketHeartbeatJs.close()
钩子函数和事件函数
websocketHeartbeatJs.onclose (function)
websocketHeartbeatJs.onclose = () => {
console.log('connect close');
}
websocketHeartbeatJs.onerror (function)
websocketHeartbeatJs.onerror = () => {
console.log('connect onerror');
}
websocketHeartbeatJs.onopen (function)
websocketHeartbeatJs.onopen = () => {
console.log('open success');
}
websocketHeartbeatJs.onmessage (function)
websocketHeartbeatJs.onmessage = (e) => {
console.log('msg:', e.data);
}
websocketHeartbeatJs.onreconnect (function)
websocketHeartbeatJs.onreconnect = (e) => {
console.log('reconnecting...');
}
demo
demo show
npmjs:https://www.npmjs.com/package/websocket-heartbeat-js
github:https://github.com/zimv/websocket-heartbeat-js
下一篇: Linux shell 编写端口扫描脚本
推荐阅读
-
PDMan-2.1.0 正式发布:用心打造开源、免费的国产数据库建模工具
-
人工智能助力木材行业--SIGAI 正式发布原木智能检测(测量)产品
-
websocket-heartbeat-js 心跳检测库正式发布
-
前端搭建指南:调试本地开发环境的实用技巧 - 在CLI脚手架项目里,别忘了添加库文件及其版本依赖 1. 实时联动与修改: a) 首先确保在当前CLI脚手架项目的`package.json`依赖中加入所用库文件及其正确版本。 b) 通过npm link在本地创建硬连接,使得库与项目能实时修改、同步。运行如下命令: ``` $ cd your-lib-dir $ npm link $ cd your-cli-dir $ npm link your-lib ``` 2. 模拟部署环境: 当需测试线上环境时,解除本地软链接。回到库文件目录并执行: ``` $ cd your-lib-dir $ npm unlink ``` 同样,在CLI项目目录执行: ``` $ cd your-cli-dir $ npm uninstall your-lib --save ``` 注意此时可能会出现因缺少库文件依赖导致的错误,但可暂且忽略,这样能避免将来遗漏或重复安装的问题。 3. 发布后的操作: 如果库已上线,可先清空CLI项目的`node_modules`目录(`rm -rf node_modules`),然后重新安装所有依赖: ``` $ npm install ``` 通过以上步骤,您就能顺畅地调试和部署您的脚手架项目了。 总结 `link` & `unlink` 命令的运用: 1. `npm link`:在本地创建硬连接,便于实时协作与同步。 2. `npm unlink`:模拟线上环境并解除软链接,为正式部署做准备。
-
3.6版本的Taro正式发布:支持跨端路由和请求库,增强鸿蒙、Web端平台插件的功能,并提升了小程序的持续集成CI能力