websocket 心跳包重连

上次咱们讲过了websocket断线重连的问题,那么久会有人提出疑问了,心跳包重连跟断线重连有什么区别呢? android

其实这两个都是为了达到一个目的,那就是保证当前设备的网络状态保持通畅。。。而断线重连呢,只能保证网络失去链接的时候有效,并不能保证网络断开的时候有效。。。这么说可能就有不少人迷糊了,这二者之间有什么区别呢?web

其实很简单哈,至少我是这么理解的。网络失去链接的时候是你手动关闭网络或禁用网络时,这个时候会触发到websocket中的onclose事件,也就是说他会触发断线重连,json

而网络断开的时候呢,指的是比较简单粗暴的方法,例如直接拔网线之类的。。。。而这个时候呢是不会触发onclose事件的,那这个时候咱们要怎么办呢,咱们就须要用到心跳重连了服务器

好啦,说了这么多,如今咱们直接来看代码吧。。。。websocket

首先是断线重连,这个咱们就不说了,若是没明白的能够去看我写的另一篇关于断线重连的文章,这里我就很少说了。。。。网络

那么咱们重点来说一下心跳包重连socket

if (jsonGotData.hasOwnProperty('id')) {
  timestampVal = new Date(jsonGotData.now_time);
  heartbeatLive(webSocket, timestampVal);
}
if (jsonGotData.hasOwnProperty('heartbeat')) {
  timestampVal = new Date(jsonGotData.heartbeat);
  return heartbeatLive(webSocket, timestampVal);
}

这是在onmessage中收到信息时候的处理,那么咱们来具体分析函数

if (jsonGotData.hasOwnProperty('id')) {
  timestampVal = new Date(jsonGotData.now_time);
  heartbeatLive(webSocket, timestampVal);
}

首先这里咱们是判断服务端发送的是否是id字段,这使得咱们能够来初始化发送时间this

if (jsonGotData.hasOwnProperty('heartbeat')) {
  timestampVal = new Date(jsonGotData.heartbeat);
  return heartbeatLive(webSocket, timestampVal);
}

而后是判断服务端有没有发送heartbeat字段来判断是否是在心跳周期以内code

OK,那么来看具体的心跳函数

heartbeatLive = (function(_this) {
  return function(conn, nowTime) {
    var nowtime, hbt;
    nowtime = new Date();
    if ((nowTime.add({
      minutes: 1
    })).isBefore(androidNowtime)) {
      clearTimeout(hbt);
      return newConnection();
    }
    return hbt = setTimeout(function() {
      return conn.send('heartbeat');
    }, 60000);
  };
})(this);

这个心跳函数的功能是怎么样的呢,主要的逻辑是将本地的时间与获取到服务器的心跳时间作一个比较,判断咱们的心跳阶段是否是处于一个“健康期”,若是存在的话,那天然是继续正常的心跳啦,那若是不正常的话,咱们就要来重连了。。。

而咱们用这个心跳重连的方法呢,就能够保证某些傻小白把网线给拔了,都不知道问题出在哪里,这样就能够放心地使用咱们的消息推送了,哈哈。。。