websocket-heartbeat-js心跳检测库正式发布

前言:

两年前写了一篇websocket心跳的博客——初探和实现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 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

原文地址:https://www.cnblogs.com/1wen/p/9789260.html

时间: 2024-10-10 16:24:50

websocket-heartbeat-js心跳检测库正式发布的相关文章

js websocket 心跳检测,断开重连,超时重连

1 function longSock(url, fn, intro = '') { 2 let lockReconnect = false //避免重复连接 3 let timeoutFlag = true 4 let timeoutSet = null 5 let reconectNum = 0 6 const timeout = 30000 //超时重连间隔 7 let ws 8 function reconnect() { 9 if (lockReconnect) return 10 l

javascript websocket 心跳检测机制介绍

====测试代码: ==index.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <div> abc </div> </body> <script type=&qu

webSocket 前端 js 加入 心跳机制 的基本写法

1前言 websocket 一般 每隔 90 无操作则会自动断开  ,需要加入一个心跳机制 来防止 自断 2. 实验过程 (1)设定一个jsp 或html 文件都行 ,加入元素 (2)js 源码 ,点击查看 1 //避免重复链接 2 var lockReconnect = false; 3 //路径 4 var wsUrl = $("#wsUrl").val(); 5 console.log("路径" + wsUrl); 6 //webSocket对象 7 var

netty心跳检测 heartbeat(五)

HeartBeat心跳 心跳检测的必要性  1.集群心跳检测,避免网络中断 2.数据同步:主节点写日志,从节点每隔一段时间拉取主节点日志. 心跳检测存在的意义: 客户端和服务端已经建立了长连接,客户端开飞行模式,关机,关闭wifi,服务端不会(感知)收到通知(handRemoved)并关闭连接. 核心事件 : ChannelInboundHandlerAdapter类的userEventTriggered事件 心跳检测服务端代码 : server启动类 : 1 public class Hear

heartbeat心跳检测和裂脑

heartbeat的心跳连接: 讲过上面的描述,要部署heartbeat服务,至少需要两台主机才能完成.那么,要实现高可用服务,这两台主机之间,是如何做到互相通信互相监控的呢/ 下面是两台heartbeat主机之间通信的一些常用的可行的方法: 1)串行电缆,即所谓的串口(首选,缺点是距离不能太远) 2)一根以太网电缆量网口直连(生产环境中常用的方式) 3)以太网电缆,通过交换机等网络设备连接(次选,原因是增加了故障点,不好排查故障,同时,线路不是专用的心跳线,容易受其他数据传输的影响,导致心跳报

面向Web Cloud的HTML5 App开发实战:Browser&amp;HTML5&amp;CSS3&amp;PhoneGap&amp;jQuery Mobile&amp; WebSocket&amp;Node.js(2天)

如何理解Android架构设计的初心并开发出搭载Android系统并且具备深度定制和软硬整合能力特色产品,是本课程解决的问题. 课程以Android的五大核心:HAL.Binder.Native Service.Android Service(并以AMS和WMS为例).View System为主轴,一次性彻底掌握Android的精髓. 之所以是开发Android产品的必修课,缘起于: 1,     HAL是Android Framework&Application与底层硬件整合的关键技术和必修技

EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服务器的心跳检测

回到目录 上一讲中基本实现了对数据库的读写分离,而在选择只读数据库上只是随机选择,并没有去检测数据库服务器是否有效,如服务器挂了,SQL服务停了,端口被封了等等,而本讲主要对以上功能进行一个实现,并对配置文件也进行了一些优化,让它更好的支持多个数据库服务器,分别配置各个的账号和密码及数据库服务端口等等,接下来,就来看一下主要的代码吧. 一 配置文件 <!-- ef实现对sql读写分离的配置,sqlserver端采用发布与订阅实现 --> <add key="readDb&quo

js常用工具库XCLJsTool v1.0发布

最近有空,整了一个js的工具库,还没有正式用于项目中,自己也没有时间写测试用例,想了一下,还是贴出来给大家看看,如果有问题,请留言,非常感谢!项目我放在了github上面,会经常更新的,过段时间会发布一版! /** * 欢迎使用本程序,您可以任意修改.复制.分享本程序所有代码,只需要保留本注释即可,谢谢! * 项目地址:<span style="color:#ff0000;">https://github.com/xucongli1989/XCLJsTool</spa

百度静态资源(JS)公共库

     例如: chosen http://apps.bdimg.com/libs/chosen/1.1.0/chosen.jquery.min.js classlist http://apps.bdimg.com/libs/classlist/2014.01.31/classList.min.js cookies.js http://apps.bdimg.com/libs/Cookies.js/0.4.0/cookies.min.js dojo http://apps.bdimg.com/l