这是服务端发的心跳(示例)
一直都有心跳, 但是总是频繁重连(示例)
下面是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逻辑:
每次接收到心跳,都设置定时器。
判断心跳与定时器时间差,设置大于25秒即重连
连续有心跳不会触发重连,少一次心跳时间差就是30秒
另外:
重连之前原本20秒一次的心跳就变得频繁
(频繁心跳不一定会重连, 但重连之前都是频繁的心跳)
所以为什么在一直有心跳的情况下还触发重连机制, 我该怎么做才能在该重连的时候重连。有没有人帮忙指点迷津, 感谢!!
仔细查看下定时器的逻辑:
last_time_check_ws
;30s
,再取时间戳,与last_time_check_ws
比对,如果大于25s
,触发重连。看到问题了没有?
30s
恒大于25s
,所以重连每次都会被触发。解决问题的方法是,这里做一个防抖:
每收到一个心跳信号你都要设一个定时器,设定在
30s
后进行重连(这个时间差大于心跳周期即可,当然也不能太长),并且需要记住这个定时的ID
;如果在这
30s
内又收到一个心跳信号,就赶紧取消上一个定时器,然后设置一个新的定时器……