1. 心跳重连原由

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

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

前端断开

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

后端断开

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

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

2. 心跳重连的简单实现

2.1 通过createWebSocket创建连接

function createWebSocket() {

try {

ws = new WebSocket(wsUrl);

init();

} catch(e) {

console.log('catch');

reconnect(wsUrl);

}

}

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

function init() {

ws.onclose = function () {

console.log('链接关闭');

reconnect(wsUrl);

};

ws.onerror = function() {

console.log('发生异常了');

reconnect(wsUrl);

};

ws.onopen = function () {

//心跳检测重置

heartCheck.start();

};

ws.onmessage = function (event) {

console.log('接收到消息');

//拿到任何消息都说明当前连接是正常的

heartCheck.start();

}

}

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

var lockReconnect = false;//避免重复连接

function reconnect(url) {

if(lockReconnect) {

return;

};

lockReconnect = true;

//没连接上会一直重连,设置延迟避免请求过多

tt && clearTimeout(tt);

tt = setTimeout(function () {

createWebSocket(url);

lockReconnect = false;

}, 4000);

}

2.4 心跳检测

//心跳检测

var heartCheck = {

timeout: 3000, //每隔三秒发送心跳

severTimeout: 5000, //服务端超时时间

timeoutObj: null,

serverTimeoutObj: null,

start: function(){

var _this = this;

this.timeoutObj && clearTimeout(this.timeoutObj);

this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);

this.timeoutObj = setTimeout(function(){

//这里发送一个心跳,后端收到后,返回一个心跳消息,

//onmessage拿到返回的心跳就说明连接正常

ws.send("123456789"); // 心跳包

//计算答复的超时时间

_this.serverTimeoutObj = setTimeout(function() {

ws.close();

}, _this.severTimeout);

}, this.timeout)

}

}

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

//心跳检测

var heartCheck = {

timeout: 3000, //每隔三秒发送心跳

num: 3, //3次心跳均未响应重连

timeoutObj: null,

serverTimeoutObj: null,

start: function(){

var _this = this;

var _num = this.num;

this.timeoutObj && clearTimeout(this.timeoutObj);

this.serverTimeoutObj && clearTimeout(this.serverTimeoutObj);

this.timeoutObj = setTimeout(function(){

//这里发送一个心跳,后端收到后,返回一个心跳消息,

//onmessage拿到返回的心跳就说明连接正常

ws.send("123456789"); // 心跳包

_num--;

//计算答复的超时次数

if(_num === 0) {

ws.colse();

}

}, this.timeout)

}

}

最后总结下

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

socket心跳机制图片_WebSocket心跳检测和重连机制相关推荐

  1. socket心跳机制图片_socket心跳包机制

    心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包 心跳包的作用 网络中的接收和发送数据都是使用SOCKET进行实现.但 ...

  2. Websocket心跳检测、重连机制

    前言 为了获取实时数据,前端需要和后端保持通信,HTTP 协议只能是客户端向服务器发出请求,服务器返回查询结果.这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦.我们只能使 ...

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

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

  4. websocket心跳链接代码_websocket心跳的实现(包括全部代码)

    本文主要讲的是如果设计websocket心跳已经需要考虑哪些问题. 前言 在使用websocket的过程中,有时候会遇到客户端网络关闭的情况,而这时候在服务端并没有触发onclose事件.这样会: 多 ...

  5. Spring Boot + WebSocketClient + wss协议证书认证 + 客户端心跳重连机制

    近期公司项目中要对接第三方的WebSocket服务获取数据,本来以为是很简单的工作,但问题是服务方提供的是"wss"协议,需要证书认证,为此查阅了很多博客,都没有解决, 最后还是自 ...

  6. 一文详细解析kafka重平衡机制

    前言 1.队列重平衡概述 如果对RocketMQ或者对消息中间件有所了解的话,消费端在进行消息消费时至少需要先进行队列(分区)的负载,即一个消费组内的多个消费者如何对订阅的主题中的队列进行负载均衡,当 ...

  7. tcp 重连 java,TCP断线重连机制

    断线重连机制 [java] view plain copy /** * 断线重连机制 * Created by fflin on 2016/5/8. */ public class Reconnect ...

  8. socket心跳检测和重连小demo

    转载自: http://blog.csdn.net/u011791526/article/details/53536403 有时候我们的程序要求socket一直保持连接,并且希望在socket断开以后 ...

  9. websocket心跳链接代码_WebSocket原理与实践(五)--心跳及重连机制

    在使用websocket的过程中,有时候会遇到网络断开的情况,但是在网络断开的时候服务器端并没有触发onclose的事件.这样会有:服务器会继续向客户端发送多余的链接,并且这些数据还会丢失.所以就需要 ...

最新文章

  1. Android2.3操作系统即将发布,亮点解读
  2. VBA实战技巧精粹012:查找指定目录下的指定文件及Dir函数用法
  3. 关于java中的数组
  4. 【渝粤题库】陕西师范大学400013 组织行为学 作业(专升本)
  5. Cortex-M3工作模式与异常
  6. null、undefined、NaN区分解析和条件判定,以及在IF条件中的判定
  7. dart js转换_基于dart生态的FaaS前端一体化建设
  8. hibernate hql 关联查询_Hibernate【关联查询篇】
  9. kubernetes Serverless、CaaS、FaaS是什么
  10. 用户名 不在 sudoers 文件中。此事将被报告。
  11. fillna填充某一列_DataFrame基础运算以及空值填充的案例分析
  12. 信杂比公式_信噪比(信噪比计算公式)
  13. 自建服务器好还是外包,自建与外包对比:如何使你的IT回归内部
  14. Android 9.0 wifi 热点 汇总
  15. HTTPS之SNI介绍
  16. 业务规范之springboot整合swagger2
  17. 360手机刷机:360N7pro刷机
  18. STM32系统时钟详解
  19. origin pro 2021去水印
  20. matlab MAM1算法和FPGA实现

热门文章

  1. 使用Mask-RCNN在实例分割应用中克服过拟合
  2. 链表问题11——两个单链表相交的系列问题(一):找到有环链表的环入口节点
  3. sqoop数据迁移的应用
  4. Linux下通过txt文件导入数据到MySQL数据库
  5. js把文字中的空格替换为横线
  6. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)...
  7. AndroidUI 视图动画-旋转动画效果 (RotateAnimation)
  8. 遇到的仍未学习的各种结论
  9. 模仿android谷歌地图功能开发记录
  10. Excel事半功倍的应用