WebSocket斷開緣由剖析,再也不怕為何又斷開了

瀏覽原文:https://wdd.js.org/websocket-…

1. 把毛病打印出來

WebSocket斷開的緣由有許多,最幸虧WebSocket斷開時,將毛病打印出來。

在線demo地點:https://wdd.js.org/websocket-…

《WebSocket斷開緣由剖析,再也不怕為何又斷開了》

ws.onclose = function (e) {
  console.log('websocket 斷開: ' + e.code + ' ' + e.reason + ' ' + e.wasClean)
  console.log(e)
}

假如你想本身玩玩WebSocket, 然則你又不想本身布置一個WebSocket效勞器,你能夠運用
ws = new WebSocket('wss://echo.websocket.org/'), 你向echo.websocket.org發送音訊,它會復興你一樣的音訊。

2. 主要信息毛病狀況碼

WebSocket斷開時,會觸發CloseEvent, CloseEvent會在銜接封閉時發送給運用 WebSockets 的客戶端. 它在 WebSocket 對象的 onclose 事宜監聽器中運用。CloseEvent的code字段示意了WebSocket斷開的緣由。能夠從該字段中剖析斷開的緣由。

CloseEvent有三個字段須要注重, 經由過程剖析這三個字段,平常就能夠找到斷開緣由

  • CloseEvent.code: code是毛病碼,是整數範例
  • CloseEvent.reason: reason是斷開緣由,是字符串
  • CloseEvent.wasClean: wasClean示意是不是一般斷開,是布爾值。平常非常斷開時,該值為false

《WebSocket斷開緣由剖析,再也不怕為何又斷開了》

3. 封閉狀況碼錶

平常來說1006的毛病碼湧現的狀況比較罕見,該毛病碼平常湧現在斷網時。

狀況碼稱號形貌
0–999保存段, 未運用.
1000CLOSE_NORMAL一般封閉; 不管為什麼目標而建立, 該鏈接都已勝利完成任務.
1001CLOSE_GOING_AWAY終端脫離, 能夠因為效勞端毛病, 也能夠因為瀏覽器正從翻開銜接的頁面跳轉脫離.
1002CLOSE_PROTOCOL_ERROR因為協定毛病而中綴銜接.
1003CLOSE_UNSUPPORTED因為吸收到不允許的數據範例而斷開銜接 (如僅吸收文本數據的終端吸收到了二進制數據).
1004 保存. 其意義能夠會在將來定義.
1005CLOSE_NO_STATUS 保存. 示意沒有收到預期的狀況碼.
1006CLOSE_ABNORMAL 保存. 用於希冀收到狀況碼時銜接非一般封閉 (也就是說, 沒有發送封閉幀).
1007Unsupported Data因為收到了花樣不符的數據而斷開銜接 (如文本音訊中包含了非 UTF-8 數據).
1008Policy Violation因為收到不符合約定的數據而斷開銜接. 這是一個通用狀況碼, 用於不適合運用 1003 和 1009 狀況碼的場景.
1009CLOSE_TOO_LARGE因為收到過大的數據幀而斷開銜接.
1010Missing Extension客戶端希冀效勞器約定一個或多個拓展, 但效勞器沒有處置懲罰, 因而客戶端斷開銜接.
1011Internal Error客戶端因為碰到沒有預感的狀況阻撓其完成要求, 因而效勞端斷開銜接.
1012Service Restart效勞器因為重啟而斷開銜接.
1013Try Again Later效勞器因為暫時緣由斷開銜接, 如效勞器過載因而斷開一部分客戶端銜接.
1014由 WebSocket規範保存以便將來運用.
1015TLS Handshake保存. 示意銜接因為沒法完成 TLS 握手而封閉 (比方沒法考證效勞器證書).
1016–1999由 WebSocket規範保存以便將來運用.
2000–2999由 WebSocket拓展保存運用.
3000–3999能夠由庫或框架運用.? 不應由運用運用. 能夠在 IANA 註冊, 先到先得.
4000–4999能夠由運用運用.

4. 其他注重事項

假如你的效勞地點的域是HTTPS的,那末運用的WebSocket協定也必需是wss, 而不能是ws

5. 如安在老IE上運用原生WebSocket?

web-socket-js是基於flash的手藝,只須要引入兩個js文件和一個swf文件,就能夠讓瀏覽器用於險些原生的WebSocket接口。別的,web-socket-js照樣須要在ws效勞端843端口做一個flash安全策略文件的效勞。

我本身曾基於stompjs和web-socket-js,做WebSocket兼容到IE5, 固然了stompjs在低版本的IE上有兼容性問題, 而且stompjs已不再保護了,你能夠運用我fork的一個版本,地點是:https://github.com/wangduandu…

主如果老版本IE在正則表達式行動方面有點非常。


      // fix ie8, ie9, RegExp not normal problem
      // in chrome the frames length will be 2, but in ie8, ie9, it well be 1
      // by wdd 20180321
      if (frames.length === 1) {
        frames.push('')
      }

6. 參考

    原文作者:Carl
    原文地址: https://segmentfault.com/a/1190000014582485
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞