websocket心跳重连机制 , 有心跳但不知为何重连
这是服务端发的心跳(示例)
一直都有心跳, 但是总是频繁重连(示例)
下面是js里的心跳重连机制, 服务端发送心跳消息会通过websocket.onmessage触发此函数
按照这个流程, 只要心跳不断, 就不会触发重连, 有没有人帮忙指点迷津, 感谢!!
function sundyn_ws_check(s) {var obj = eval('(' + s + ')');
if ("time" in obj) {
last_time_check_ws = new Date().getTime();
setTimeout(function () {
if ((new Date().getTime() - last_time_check_ws) > 25000) {
app.RetryConn();
}
}, 30000);
}
}
js逻辑:
一小格10秒,设置定时器,判断心跳间隔时间差,连续有心跳就不会触发重连
另外:
重连之前原本20秒一次的心跳就变得频繁
(频繁心跳不一定会重连, 但重连之前都是频繁的心跳)
敢问为什么在一直有心跳的情况下还触发重连机制, 我该怎么做才能在该重连的时候重连
回答
仔细查看下定时器的逻辑:
- 开始定时前,获取系统时间戳
last_time_check_ws
; - 定时
30s
,再取时间戳,与last_time_check_ws
比对,如果大于25s
,触发重连。
看到问题了没有? 30s
恒大于 25s
,所以重连每次都会被触发。
解决问题的方法是,这里做一个防抖:
每收到一个心跳信号你都要设一个定时器,设定在 30s
后进行重连(这个时间差大于心跳周期即可,当然也不能太长),并且需要记住这个定时的 ID
;
如果在这 30s
内又收到一个心跳信号,就赶紧取消上一个定时器,然后设置一个新的定时器……
以上是 websocket心跳重连机制 , 有心跳但不知为何重连 的全部内容, 来源链接: utcz.com/a/38522.html