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逻辑:
每次接收到心跳,都设置定时器。
判断心跳与定时器时间差,设置大于25秒即重连
连续有心跳不会触发重连,少一次心跳时间差就是30秒
image

另外:
重连之前原本20秒一次的心跳就变得频繁
(频繁心跳不一定会重连, 但重连之前都是频繁的心跳)

所以为什么在一直有心跳的情况下还触发重连机制, 我该怎么做才能在该重连的时候重连。有没有人帮忙指点迷津, 感谢!!

阅读 3.6k
1 个回答

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

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

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


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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题