这篇具有很好参考价值的文章主要介绍了WebSocket心跳检测和重连机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。
1. 心跳重连原由
心跳和重连的目的用一句话概括就是客户端和服务端保证彼此还活着,避免丢包发生。
websocket
连接断开有以下两证情况:
前端断开
在使用websocket
过程中,可能会出现网络断开的情况,比如信号不好,或者网络临时关闭,这时候websocket的连接已经断开,而不同浏览器有不同的机制,触发onclose
的时机也不同,并不会理想执行websocket
的onclose
方法,我们无法知道是否断开连接,也就无法进行重连操作。
后端断开
如果后端因为一些情况需要断开ws,在可控情况下,会下发一个断连的消息通知,之后才会断开,我们便会重连。
如果因为一些异常断开了连接,我们是不会感应到的,所以如果我们发送了心跳一定时间之后,后端既没有返回心跳响应消息,前端又没有收到任何其他消息的话,我们就能断定后端主动断开了。
因此需要一种机制来检测客户端和服务端是否处于正常连接的状态。通过在指定时间间隔发送心跳包来保证连接正常,如果连接出现问题,就需要手动触发onclose
事件,这时候便可进行重连操作。因此websocket
心跳重连就应运而生。
2. 心跳重连的简单实现
2.1 通过createWebSocket创建连接
1 2 3 4 5 6 7 8 9 |
function createWebSocket() { try { ws = new WebSocket(wsUrl); init(); } catch(e) { console.log('catch'); reconnect(wsUrl); } } |
2.2 创建init方法,初始化一些监听事件,如果希望websocket连接一直保持, 我们会在close或者error上绑定重新连接方法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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
变量避免重复连接
1 2 3 4 5 6 7 8 9 10 11 12 13 |
var lockReconnect = false;//避免重复连接 function reconnect(url) { if(lockReconnect) { return; }; lockReconnect = true; //没连接上会一直重连,设置延迟避免请求过多 tt && clearTimeout(tt); tt = setTimeout(function () { createWebSocket(url); lockReconnect = false; }, 4000); } |
2.4 心跳检测
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
//心跳检测 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次心跳包服务端均未回复才判定为失去连接,所以这时需要加上计数来判断。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
//心跳检测 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) } } |
最后总结下 文章来源:https://www.toymoban.com/news/detail-811134.html
我们确认了后端单台服务器的处理能力有限,因此。我们需要做集群。其次我们为了不让前端关闭或回收,后端不响应。我们需要设置心跳,定时清除无关的连接。
最后,我们需要有消息确认机制,做到保证消息的100%接收。文章来源地址https://www.toymoban.com/news/detail-811134.html
到了这里,关于WebSocket心跳检测和重连机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!