初探和实现websocket心跳重连

心跳重连缘由

在使用websocket过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时性关闭,这时候websocket的连接已经断开,

而浏览器不会执行websocket 的 onclose方法,我们无法知道是否断开连接,也就无法进行重连操作。

如果当前发送websocket数据到后端,一旦请求超时,onclose便会执行,这时候便可进行绑定好的重连操作。

因此websocket心跳重连就应运而生。

如何实现

在websocket实例化的时候,我们会绑定一些事件:

var ws = new WebSocket(url);
ws.onclose = function () {
    //something
};
ws.onerror = function () {
    //something
};

ws.onopen = function () {
   //something
};
ws.onmessage = function (event) {
   //something
}

如果希望websocket连接一直保持,我们会在close或者error上绑定重新连接方法。

ws.onclose = function () {
    reconnect();
};
ws.onerror = function () {
    reconnect();
};
    

这样一般正常情况下失去连接时,触发onclose方法,我们就能执行重连了。

那么针对断网的情况的心跳重连,怎么实现呢。

简单的实现:

var heartCheck = {
    timeout: 60000,//60ms
    timeoutObj: null,
    reset: function(){
        clearTimeout(this.timeoutObj);     this.start();
    },
    start: function(){
        this.timeoutObj = setTimeout(function(){
            ws.send("HeartBeat", "beat");
        }, this.timeout)
    }
}

ws.onopen = function () {
   heartCheck.start();
};
ws.onmessage = function (event) {
    heartCheck.reset();
}

如上代码,heartCheck 的 reset和start方法主要用来控制心跳的定时。

当onopen也就是连接上时,我们便开始start计时,如果在定时时间范围内,onmessage获取到了服务器的消息,我们就重置倒计时,

所以在距离上次从服务器获取到消息,闲置60秒之后我们才会心跳检测,这个检测时间可以自己根据自身情况设定。

当心跳检测send执行之后,如果当前websocket是断开状态,发送超时之后,onclose方法便会被执行,重连也执行了。

如此一来,我们的心跳检测就实现了。

后来,我本想测试websocket超时时间,又发现了一些新的问题

1. 在chrome中,如果心跳检测 也就是websocket实例执行send之后,15秒内没发送到另一接收端,onclose便会执行。那么超时时间是15秒。

2. 我又打开了Firefox ,Firefox在断网7秒之后,直接执行onclose。说明在Firefox中不需要心跳检测便能自动onclose。

3.  同一代码, reconnect方法 在chrome 执行了一次,Firefox执行了两次。当然我们在几处地方(代码逻辑处和websocket事件处)绑定了reconnect(),

所以保险起见,我们还是给reconnect()方法加上一个锁,保证只执行一次

目前来看不同的浏览器,有不同的机制,无论浏览器websocket自身会不会在断网情况下执行onclose,加上心跳重连后,已经能保证onclose的正常触发。

时间: 2024-10-06 23:20:00

初探和实现websocket心跳重连的相关文章

Spring WebSocket初探2 (Spring WebSocket入门教程)<转>

See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的demo出来. 接上一篇:Spring WebSocket初探1 (Spring WebSocket入门教程) WebSocket前端准备 前端我们需要用到两个js文件:sockjs.js和stomp.js SockJS:SockJS 是一个浏览器上运行的 JavaScript 库,如果浏览器不支持 W

netty实现客户端服务端心跳重连

使用netty实现客户端服务端心跳重连 前言: 公司的加密机调度系统一直使用的是http请求调度的方式去调度,但是会出现网络故障导致某个客户端或者服务端断线的情况,导致很多请求信息以及回执信息丢失的情况,接着我们抛弃了http的方式,改为Tcp的方式去建立客户端和服务器之间的连接,并且要去实现断线重连的功能,经过讨论后决定使用java中成熟的nio框架 – netty去解决这一系列的问题. 1.       netty简单介绍: 在百度中对netty的解释是: Netty是由JBOSS提供的一个

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 断线重连

服务端为swoole 的websocket 客户端js代码: //1.创建websocket客户端 var wsServer = 'ws://ip/'; var limitConnect = 3; // 断线重连次数 var timeConnect =0; webSocketInit(wsServer); //socket初始化 function webSocketInit(service){ var ws = new WebSocket(service); ws.onopen = functi

c# socket 心跳 重连

/// <summary> /// 检查一个Socket是否可连接 /// </summary> /// <param name="socket"></param> /// <returns></returns> private bool IsConnected(Socket socket) { if (socket == null) { return false; } bool blockingState = s

Spring WebSocket初探1 (Spring WebSocket入门教程)&lt;转&gt;

See more: Spring WebSocket reference整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的demo出来. WebSocket是html5带来的一项重大的特性,使得浏览器与服务端之间真正长连接交互成为了可能,这篇文章会带领大家窥探一下Spring 对WebSocket的支持及使用. 1. 基础环境 快速搭建Spring框架,我们使用Spring boot,这里先不讨论SpringBoot,只知

vue中websocket心跳写法

先来参考别人的 https://www.jianshu.com/p/09b91b9a778f https://www.jianshu.com/p/ab47f613e8c6 https://blog.csdn.net/hailangtuteng/article/details/87690056 博客与解释心跳原理的 https://www.cnblogs.com/tugenhua0707/p/8648044.html 原文地址:https://www.cnblogs.com/lsc-boke/p/

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

前言: 两年前写了一篇websocket心跳的博客——初探和实现websocket心跳重连.  阅读量一直比较大,加上最近考虑写一个自己的npm包,因此就完成了一个websocket心跳的检测库.在这里先感谢几个提供帮助的大佬朋友们,小弟受益匪浅. 介绍 websocket-heartbeat-js基于浏览器js原生websocket封装,主要目的是保障客户端websocket与服务端连接状态.该程序有心跳检测及自动重连机制,当网络断开或者后端服务问题造成客户端websocket断开,程序会自动