心跳重连缘由

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

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

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

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

?

如何实现

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

?

var ws = newWebSocket(url);

ws.onclose= () {//something

};

ws.οnerrοr= function() {//something

};

ws.onopen= function() {//something

};

ws.onmessage= function(event) {//something

}

?

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

?

ws.onclose = function() {

reconnect();

};

ws.οnerrοr= 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");

},this.timeout)

}

}ws.onopen= function() {

heartCheck.start();

};

ws.onmessage = function(event) {

heartCheck.reset();

}

?

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

什么条件下执行心跳:

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

距离上次从后端获取到消息超过60秒之后,执行心跳检测,看是不是断连了,这个检测时间可以自己根据自身情况设定。

判断前端ws断开(断网但不限于断网的情况):

当心跳检测send方法执行之后,如果当前websocket是断开状态(或者说断网了),发送超时之后,浏览器的ws会自动触发onclose方法,重连也执行了(onclose方法体绑定了重连事件),如果当前一直是断网状态,重连会2秒(时间是自己代码设置的)执行一次直到网络正常后连接成功。

如此一来,我们判断前端主动断开ws的心跳检测就实现了。为什么说是前端主动断开,因为当前这种情况主要是通过前端ws的事件来判断的,后面说后端主动断开的情况。

?

我本想测试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的正常触发。

?

判断后端断开:

? ? 如果后端因为一些情况断开了ws,是可控情况下的话,会下发一个断连的消息通知,之后才会断开,我们便会重连。

如果因为一些异常断开了连接,我们是不会感应到的,所以如果我们发送了心跳一定时间之后,后端既没有返回心跳响应消息,前端又没有收到任何其他消息的话,我们就能断定后端主动断开了。

一点特别重要的发送心跳到后端,后端收到消息之后必须返回消息,否则超过60秒之后会判定后端主动断开了。再改造下代码:

?

?

var heartCheck ={

timeout:60000,//60ms

timeoutObj: null,

serverTimeoutObj:null,

reset:function(){

clearTimeout(this.timeoutObj);

clearTimeout(this.serverTimeoutObj);this.start();

},

start:function(){var self = this;this.timeoutObj = setTimeout(function(){

ws.send("HeartBeat");

self.serverTimeoutObj= setTimeout(function(){

ws.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次

}, self.timeout)

},this.timeout)

},

}

ws.onopen= function() {

heartCheck.start();

};

ws.onmessage= function(event) {

heartCheck.reset();

}

ws.onclose = function() {

reconnect();

};

ws.onerror = function() {

reconnect();

};

?

?

?

PS:

? ? 因为目前我们这种方式会一直重连如果没连接上或者断连的话,如果有两个设备同时登陆并且会踢另一端下线,一定要发送一个踢下线的消息类型,这边接收到这种类型的消息,逻辑判断后就不再执行reconnect,否则会出现一只相互挤下线的死循环。

?

整理了一个简单的demo到github,点击查看https://github.com/zimv/WebSocketHeartBeat

?

原文链接:http://www.cnblogs.com/1wen/p/5808276.html

java 心跳 断网重连_工作笔记5 - websocket心跳重连机制相关推荐

  1. c# websocket 心跳重连_初探和实现websocket心跳重连(npm: websocket-heartbeat-js) - 子慕大诗人 - 博客园...

    (event) { heartCheck.reset(); 如上代码,heartCheck 的 reset和start方法主要用来控制心跳的定时. 什么条件下执行心跳: 当onopen也就是连接成功后 ...

  2. java arp 攻击_基于Jpcap的Java ARP断网攻击

    这是大二学习计算机网络的时候写的一个小程序,可实现局域网内断网攻击.这也作为学习网络层.数据链路层(在OSI模型中ARP协议属于链路层:而在TCP/IP模型中,ARP协议属于网络层)的其中一个小实验吧 ...

  3. 电脑频繁断网怎么回事_家里网络间歇性断网什么原因 家里网络间歇性断网怎么解决【介绍】...

    网络不稳定时常发生,最烦人的是打游戏时忽然掉网,网络不稳定的原因有很多,除去网络线,和网络接入信号是正常的情况下,家里网络间歇性断网是怎么回事呢?下面给大家介绍一下引起网络间歇性断网的几种比较常见的情 ...

  4. 实现断网收银_美发店收银软件六大核心功能提高门店竞争力

    中小型美发店想要壮大自身从激烈的市场竞争中脱颖而出的话,就必须得学会搭上互联网的快车,使用美发店收银软件来协助管理,设立灵活多样的优惠促销组合,吸引新客户,留住老客户,发展大客户才是美业发展的长久之路 ...

  5. 实现断网收银_美业连锁收银系统哪个好用?

    近两年火爆的美甲.美容.美体等美业,据相关数据统计,2018年,开业半年还存活的商家不超过50%,开业一年存活的不到20%,开业两年以上的不超过5%,3年老店占比不到1%.尤其是,在一线城市也频频陷入 ...

  6. 实现断网收银_便利店收银系统,可以实现简单又好用!

    一款门店收银系统既要满足操作简单,又要满足好用,换做任何一个门店老板,都会想要.在随着实体门店的需求不断增加,收银系统也在不断的改革和优化,要想做到好用,还要简单,这确实不是一件很简单的事,那到底有没 ...

  7. 实现断网收银_超市收银系统排名前五

    相信很多没有配备收银系统的老板们都想知道,市面上的收银系统这么多,总得有个排名什么的吧?为了满足各位老板们的刚性需求,这里粗略地为大家进行一个简单的排名,仅供参考,希望各位老板看的满意. 1.中仑收银 ...

  8. 实现断网收银_美国 TMobile 全国断网;ATamp;T拟裁员4700人;阿里云宣布2020年投入20亿做强生态...

    阿里云宣布2020年投入20亿做强生态 6月16日,一个重要消息!今天,我们正式宣布2020年投入20亿做强生态,帮助50家合作伙伴个个都在阿里云的生态上营收过亿! 2019年,阿里云提出" ...

  9. 实现断网收银_推拿按摩门店需要什么样的收银管理系统?

    现在线上线下不断融合,传统的门店收银管理系统早就已经跟不上时代了,前端后端脱节,数据无法沉淀,尤其现在支付方式越来越多,比如括会员预存款.银行卡.微信.支付宝.现金支付等,一般的收银系统压根无法完美统 ...

最新文章

  1. LeetCode简单题之最长的美好子字符串
  2. 【青少年编程】绘制五角星
  3. 有空间感的图片环形滚动代码
  4. 中兴通讯应用之星一键手机电子书解决方案
  5. 鸿蒙os终于开始大升级,华为鸿蒙OS终于要迎来大规模推送升级了
  6. 第六十二期:腾讯云发布“小程序·云开发十大优秀实践”:猫眼、唯品会等入选
  7. python 文本处理2
  8. [转]Angular2 使用管道Pipe以及自定义管道格式数据
  9. Spring MVC学习总结(4)——SpringMVC权限管理
  10. onDraw(canvas)和dispatchDraw(canvas)方法
  11. 样条曲面_SolidWorks肥皂块曲面建模,你的肥皂掉了
  12. 'GO' 附近有语法错误问题,我真是无语~
  13. DeepFake技术--DeepFakes 概述(一)(二)
  14. 51单片机三种烧录的方法介绍
  15. 固态硬盘怎么看出厂日期_固态硬盘使用时间怎么看,固态硬盘寿命计算方法
  16. 基于matlab的Guass-Seidel(高斯--赛德尔) 迭代法求解线性方程组
  17. Taro 3.x 开发 APP 记录 (持续记录中。。。)
  18. 2022年淘宝女王节预售活动时间介绍
  19. 北航研究生计算机网络实验报告,实验7_北航研究生计算机网络实验
  20. esp-http-client 发送 chunked 数据

热门文章

  1. Delaunay三角化实现原理
  2. PTA5-19 求链式线性表的倒数第K项
  3. 5-1 File Transfer
  4. fir数字滤波器设计与软件实现_基于FPGA低通滤波器的FIR的设计
  5. linux yum自动挂载_Linux系统本地Yum仓库制作
  6. 吴恩达《机器学习》第二章:线性回归
  7. Python提示错误 module 'request' has no attribute 'urlretrieve'
  8. webpack 的 scope hoisting 是什么?
  9. 序列化---fastjson使用
  10. mysql数据库无法被其他ip访问的解决方法