心跳機制

  • websocket 一般 每隔 90 秒無操作則會自動斷開 ,需要加入一個心跳機制 來防止 自斷
 useEffect(() => {
    //避免重復鏈接
    let lockReconnect = false;
    //路徑
    let wsUrl = `ws://xxx.yyy.com/imserver/xxx`
    //webSocket對象
    let ws;
    //時間間隔
    let tt;

    // if ("WebSocket" in window) {
    //     console.log("支持WebSocket")
    // } else {
    //     alert("該瀏覽器不支持WebSocket")
    // }

    //創建ws連接
    let createWebSocket = function (wsUrl) {
      try {
        //成功
        ws = new WebSocket(wsUrl);
        webSocketInit(); //初始化webSocket連接函數
      } catch (e) {
        // console.log('catch');
        //重連函數
        webSocketReconnect(wsUrl);
      }
    };
    //初始化方法,成功后執行
    let webSocketInit = function () {
      //連接關閉函數
      ws.onclose = function () {
        // console.log("連接已關閉...");
        webSocketReconnect(wsUrl); //如果連接關閉則重連
      };
      //連接錯誤函數
      ws.onerror = function () {
        // console.log("連接錯誤...");
        webSocketReconnect(wsUrl); //如果連接錯誤則重連
      };
      //連接建立,發送信息
      ws.onopen = function () {
        ws.send(JSON.stringify(''));
        //心跳檢測啟動
        heartCheck.start(); //訂閱業務發送之后啟動心跳檢測機制
      };
      //業務訂閱成功后接受服務端推送消息  ,其實是個字符串
      ws.onmessage = function (event) {
        // console.log('success=>', JSON.parse(event.data));
        let eventData = JSON.parse(event.data);
        //-----此處對返回數據進行處理----
        heartCheck.reset();
      };
    };

    let webSocketReconnect = function (url) {
      // console.log("socket 連接斷開,正在嘗試重新建立連接");
      if (lockReconnect) {
        return;
      }
      lockReconnect = true;
      //沒連接上會一直重連,設置延遲,避免請求過多
      //s中清楚setTimeout的定時觸發設置,之所以加個timer,是為了方便第二次賦值給timer。
      // 也就是說直接clearTImeout(timer)則timer就不存在了 再次訪問就是error了。
      // 而timer&&clearTimeout(timer)則將timer 變成undefined
      tt && clearTimeout(tt);
      tt = setTimeout(function () {
        createWebSocket(url);
      }, 4000);
    };

    //心跳檢測.所謂的心跳檢測,就是隔一段時間向服務器僅限一次數據訪問,因為長時間不使用會導致ws自動斷開,
    // 一般是間隔90秒內無操作會自動斷開,因此,在間隔時間內進行一次數據訪問,以防止ws斷開即可,
    //這里選擇30秒,倒計時30秒內無操作則進行一次訪問,有操作則重置計時器
    var heartCheck = {
      timeout: 30000, //30秒
      timeoutObj: null,
      reset: function () {
        //接收成功一次推送,就將心跳檢測的倒計時重置為30秒
        clearTimeout(this.timeoutObj); //重置倒計時
        this.start();
      },
      start: function () {
        //啟動心跳檢測機制,設置倒計時30秒一次
        this.timeoutObj = setTimeout(function () {
          // console.log("心跳一次");
          ws.send('ping'); //啟動心跳
        }, this.timeout);
      },
      //onopen連接上,就開始start及時,如果在定時時間范圍內,onmessage獲取到了服務端消息,
      // 就重置reset倒計時,距離上次從后端獲取消息30秒后,執行心跳檢測,看是不是斷了。
    };

    //開始創建webSocket連接
    createWebSocket(wsUrl);
    return () => {
      ws.close();
    };
  }, []);
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容