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);

這個心跳函數的功能是怎麼樣的呢,主要的邏輯是將本地的時間與獲取到服務器的心跳時間作一個比較,判斷咱們的心跳階段是否是處於一個「健康期」,若是存在的話,那天然是繼續正常的心跳啦,那若是不正常的話,咱們就要來重連了。。。

而咱們用這個心跳重連的方法呢,就能夠保證某些傻小白把網線給拔了,都不知道問題出在哪裏,這樣就能夠放心地使用咱們的消息推送了,哈哈。。。

相關文章
相關標籤/搜索