Websocket心跳重連

心跳重連的原因

在使用Websocket過程中, 可能會出現網絡斷開的情況, 比如信號不好, 或者網絡臨時性關閉, 這時候Websocket的連接已經斷開, 而瀏覽器不會執行websocket的onclose方法, 我們無法知道是否斷開連接, 也就無法進行重連操作.
如果當前發送websocket數據到后端, 一旦請求超時, onclose便會執行, 這時候便可進行綁定好的重連操作.因此websocket心跳重連就應運而生了.

如何實現

在websocket實例化的時候, 我們會綁定一些事件:

var ws = new Websocket(url);
ws.onclose = function(){
    // doing something
};
ws.onerror = function(){
    // doing something
};
ws.onopen = function(){
    // doing something
};
ws.onmessage = function(){
    // doing something
};

如果希望websocket連接一直保持, 我們會在close或者error上綁定重新連接方法.

ws.onclose = function(){
  reconnect();
};
ws.onerror = function(){
  reconnect();
};

這樣一般正常情況下失去連接時, 觸發onclose方法, 我們就能執行重連了.

那么針對斷網的情況的心跳重連, 怎么實現呢?
簡單的實現:

var heartCheck = {
  timeout: 60000,
  timeoutObj: null,
  reset: function(){
      clearTimeout(this.timeoutObj);
      this.start();
  },
  start: function(){
      this.timeoutObj = setTimeout(function(
        ws.send('HeartBeat');
      ){}, this.timeout)
  },
};

ws.onopen = function(){
  heartCheck.start();
};
ws.onmessage = function(event){
  heartCheck.reset();
};

如上代碼, heartCheck的reset和start方法主要用來控制定時.

什么條件下執行心跳

當onopen也就是連接上時, 我們便開始start計時, 如果在定時時間范圍內, onmessage獲取到了后端的消息, 我們就重置倒計時, 距離上次從后端獲取到消息超過60秒鐘之后, 執行心跳檢測, 看是不是斷連了, 這個檢測時間可以自己根據自身情況設定.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 心跳重連緣由 在使用websocket過程中,可能會出現網絡斷開的情況,比如信號不好,或者網絡臨時性關閉,這時候w...
    丸_子閱讀 10,762評論 3 9
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,886評論 18 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,136評論 25 708
  • 原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSo...
    敢夢敢當閱讀 8,944評論 0 50
  • 一、定義變量 數字,雙精度 字符串度 空類型 注:nil,即NULL,支持垃圾回收 布爾類型 表 二、控制語句 i...
    rh_Jameson閱讀 7,815評論 3 13