• 5
  • 新人请关照

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

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

阅读 206
评论
    1 个回答
    • 251

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

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

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


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

      撰写回答

      登录后参与交流、获取后续更新提醒

      相似问题
      推荐文章