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秒一次的心跳就变得频繁
(频繁心跳不一定会重连, 但重连之前都是频繁的心跳)

敢问为什么在一直有心跳的情况下还触发重连机制, 我该怎么做才能在该重连的时候重连

回答

仔细查看下定时器的逻辑:

  1. 开始定时前,获取系统时间戳 last_time_check_ws
  2. 定时 30s,再取时间戳,与 last_time_check_ws 比对,如果大于 25s,触发重连。

看到问题了没有? 30s 恒大于 25s ,所以重连每次都会被触发。


解决问题的方法是,这里做一个防抖:
每收到一个心跳信号你都要设一个定时器,设定在 30s 后进行重连(这个时间差大于心跳周期即可,当然也不能太长),并且需要记住这个定时的 ID
如果在这 30s 内又收到一个心跳信号,就赶紧取消上一个定时器,然后设置一个新的定时器……

以上是 websocket心跳重连机制 , 有心跳但不知为何重连 的全部内容, 来源链接: utcz.com/a/38522.html

回到顶部