1. 心跳重连原由

心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生。

websocket连接断开有以下两证情况:

前端断开

在使用websocket过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时关闭,这时候websocket的连接已经断开,而不同浏览器有不同的机制,触发onclose的时机也不同,并不会理想执行websocketonclose方法,我们无法知道是否断开连接,也就无法进行重连操作。

后端断开

如果后端因为一些情况需要断开ws,在可控情况下,会下发一个断连的消息通知,之后才会断开,我们便会重连。
如果因为一些异常断开了连接,我们是不会感应到的,所以如果我们发送了心跳一定时间之后,后端既没有返回心跳响应消息,前端又没有收到任何其他消息的话,我们就能断定后端主动断开了。

因此需要一种机制来检测客户端和服务端是否处于正常连接的状态。通过在指定时间间隔发送心跳包来保证连接正常,如果连接出现问题,就需要手动触发onclose事件,这时候便可进行重连操作。因此websocket心跳重连就应运而生。

2. 心跳重连的简单实现

2.1 通过createWebSocket创建连接

  1. function createWebSocket() {
  2. try {
  3. ws = new WebSocket(wsUrl);
  4. init();
  5. } catch(e) {
  6. console.log('catch');
  7. reconnect(wsUrl);
  8. }
  9. }

2.2 创建init方法,初始化一些监听事件,如果希望websocket连接一直保持, 我们会在close或者error上绑定重新连接方法。

  1. function init() {
  2. ws.onclose = function () {
  3. console.log('链接关闭');
  4. reconnect(wsUrl);
  5. };
  6. ws.onerror = function() {
  7. console.log('发生异常了');
  8. reconnect(wsUrl);
  9. };
  10. ws.onopen = function () {
  11. //心跳检测重置
  12. heartCheck.start();
  13. };
  14. ws.onmessage = function (event) {
  15. console.log('接收到消息');
  16. //拿到任何消息都说明当前连接是正常的
  17. heartCheck.start();
  18. }
  19. }

 2.3 重连操作,通过设置lockReconnect变量避免重复连接

  1. var lockReconnect = false;//避免重复连接
  2. function reconnect(url) {
  3. if(lockReconnect) {
  4. return;
  5. };
  6. lockReconnect = true;
  7. //没连接上会一直重连,设置延迟避免请求过多
  8. tt && clearTimeout(tt);
  9. tt = setTimeout(function () {
  10. createWebSocket(url);
  11. lockReconnect = false;
  12. }, 4000);
  13. }

 2.4 心跳检测

  1. //心跳检测
  2. var heartCheck = {
  3. timeout: 3000, //每隔三秒发送心跳
  4. severTimeout: 5000, //服务端超时时间
  5. timeoutObj: null,
  6. serverTimeoutObj: null,
  7. start: function(){
  8. var _this = this;
  9. this.timeoutObj && clearTimeout(this.timeoutObj);
  10. this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
  11. this.timeoutObj = setTimeout(function(){
  12. //这里发送一个心跳,后端收到后,返回一个心跳消息,
  13. //onmessage拿到返回的心跳就说明连接正常
  14. ws.send("123456789"); // 心跳包
  15. //计算答复的超时时间
  16. _this.serverTimeoutObj = setTimeout(function() {
  17. ws.close();
  18. }, _this.severTimeout);
  19. }, this.timeout)
  20. }
  21. }

  有的时候,客户端发送3次心跳包服务端均未回复才判定为失去连接,所以这时需要加上计数来判断。

  1. //心跳检测
  2. var heartCheck = {
  3. timeout: 3000, //每隔三秒发送心跳
  4. num: 3, //3次心跳均未响应重连
  5. timeoutObj: null,
  6. serverTimeoutObj: null,
  7. start: function(){
  8. var _this = this;
  9. var _num = this.num;
  10. this.timeoutObj && clearTimeout(this.timeoutObj);
  11. this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);
  12. this.timeoutObj = setTimeout(function(){
  13. //这里发送一个心跳,后端收到后,返回一个心跳消息,
  14. //onmessage拿到返回的心跳就说明连接正常
  15. ws.send("123456789"); // 心跳包
  16. _num--;
  17. //计算答复的超时次数
  18. if(_num === 0) {
  19. ws.colse();
  20. }
  21. }, this.timeout)
  22. }
  23. }

  最后总结下

我们确认了后端单台服务器的处理能力有限,因此。我们需要做集群。其次我们为了不让前端关闭或回收,后端不响应。我们需要设置心跳,定时清除无关的连接。
最后,我们需要有消息确认机制,做到保证消息的100%接收。

WebSocket心跳检测和重连机制的更多相关文章

  1. 【Netty】利用Netty实现心跳检测和重连机制

    一.前言 心跳机制是定时发送一个自定义的结构体(心跳包),让对方知道自己还活着,以确保连接的有效性的机制.   我们用到的很多框架都用到了心跳检测,比如服务注册到 Eureka Server 之后会维 ...

  2. javascript websocket 心跳检测机制介绍

    ====测试代码: ==index.html <!DOCTYPE html> <html lang="en"> <head> <meta ...

  3. 理解WebSocket心跳及重连机制(五)

    理解WebSocket心跳及重连机制 在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的 ...

  4. uni-app中websocket的使用 断开重连、心跳机制

    前言 最近关于H5和APP的开发中使用到了webSocket,由于web/app有时候会出现网络不稳定或者服务端主动断开,这时候导致消息推送不了的情况,需要客户端进行重连.查阅资料后发现了一个心跳机制 ...

  5. 初探和实现websocket心跳重连

    心跳重连缘由 在使用websocket过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时性关闭,这时候websocket的连接已经断开, 而浏览器不会执行websocket 的 onclos ...

  6. 初探和实现websocket心跳重连(npm: websocket-heartbeat-js)

    提示:文章最下方有仓库地址 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间没有反馈提醒.因此为了保证连接的可持续性和稳定性,websocket ...

  7. websocket心跳重连 websocket-heartbeat-js

    初探和实现websocket心跳重连(npm: websocket-heartbeat-js) 心跳重连缘由 websocket是前后端交互的长连接,前后端也都可能因为一些情况导致连接失效并且相互之间 ...

  8. Netty 之 Netty生产级的心跳和重连机制

    https://blog.csdn.net/z69183787/article/details/52625095 最近工作比较忙,但闲暇之余还是看了阿里的冯家春(fengjiachun)的github ...

  9. 基于netty实现的长连接,心跳机制及重连机制

    技术:maven3.0.5 + netty4.1.33 + jdk1.8   概述 Netty是由JBOSS提供的一个java开源框架.Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速 ...

随机推荐

  1. 【java】学习路线7-继承、super方法、重写、重载

    /*继承-java只有单继承如果你创建了很多个class,但是之间有很多相同的成员变量和成员方法,修改的时候又要多处修改好麻烦,此时就可以创建多一个类来存储这些重复的东西,统一管理.相当方便.*//* ...

  2. KingbaseES 数据脱敏功能介绍

    数据脱敏,指对某些敏感信息通过脱敏规则进行数据的变形,实现敏感隐私数据的可靠保护. KingbaseES主要提供动态数据脱敏功能. 动态数据脱敏(Dynamic Data Masking)是与生产环境 ...

  3. KingbaseES R6 集群一键修改集群和数据库参数测试案例

    ​ 案例说明: 集群环境修改集群或数据库参数,需要在每个node上都要修改,在每个节点而执行修改操作,容易出现漏改或节点上参数不一致等错误:在KingbaseES V8R6的集群中增加了,一键修改参数 ...

  4. 硬核解析MySQL的MVCC实现原理,面试官看了都直呼内行

    1. 什么是MVCC MVCC全称是Multi-Version Concurrency Control(多版本并发控制),是一种并发控制的方法,通过维护一个数据的多个版本,减少读写操作的冲突. 如果没 ...

  5. Windows 10 Technical Preview 屏幕亮度

    下载了  Windows 10 Technical Preview 安装好之后都挺正常的,就是显卡驱动没有, 联上网络, 自动找到驱动,看起来一切都挺好的. 但是重启之后,屏幕就变得特别暗了, 亮 ...

  6. MasaFramework的MinimalAPI设计

    在以前的MVC引用程序中,控制器负责接收输入信息.执行.编排操作并返回响应,它是一个功能齐全的框架,它提供了过滤器.内置了模型绑定与验证,并提供了很多可扩展的管道,但它偏重,不像其它语言是通过更加简洁 ...

  7. Kubernetes HPA 使用详解

    文章转载自:https://www.qikqiak.com/post/k8s-hpa-usage/ Kubernetes 提供了这样的一个资源对象:Horizontal Pod Autoscaling ...

  8. 第二章:视图层 - 9:动态生成CSV文件

    CSV (Comma Separated Values),以纯文本形式存储数字和文本数据的存储方式.纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样的数据.CSV文件由任意数目的记录组成,记 ...

  9. Elasticsearch:如何实现对 emoji 表情符号进行搜索

    转摘自:https://elasticstack.blog.csdn.net/article/details/114261636 Elasticsearch 是一个应用非常广泛的搜索引擎.它可以对文字 ...

  10. Elastic:Elastic Maps 基于位置的警报 - 7.10

    文章转载自:https://elasticstack.blog.csdn.net/article/details/112535618