WebSocket斷開緣由分析,不再怕爲何又斷開了

閱讀原文:https://wdd.js.org/websocket-...html

1. 把錯誤打印出來

WebSocket斷開的緣由有不少,最好在WebSocket斷開時,將錯誤打印出來。git

在線demo地址:https://wdd.js.org/websocket-...github

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斷開的緣由。能夠從該字段中分析斷開的緣由。web

CloseEvent有三個字段須要注意, 經過分析這三個字段,通常就能夠找到斷開緣由正則表達式

  • CloseEvent.code: code是錯誤碼,是整數類型
  • CloseEvent.reason: reason是斷開緣由,是字符串
  • CloseEvent.wasClean: wasClean表示是否正常斷開,是布爾值。通常異常斷開時,該值爲false

3. 關閉狀態碼錶

通常來講1006的錯誤碼出現的狀況比較常見,該錯誤碼通常出如今斷網時。chrome

狀態碼 名稱 描述
0–999 保留段, 未使用.
1000 CLOSE_NORMAL 正常關閉; 不管爲什麼目的而建立, 該連接都已成功完成任務.
1001 CLOSE_GOING_AWAY 終端離開, 可能由於服務端錯誤, 也可能由於瀏覽器正從打開鏈接的頁面跳轉離開.
1002 CLOSE_PROTOCOL_ERROR 因爲協議錯誤而中斷鏈接.
1003 CLOSE_UNSUPPORTED 因爲接收到不容許的數據類型而斷開鏈接 (如僅接收文本數據的終端接收到了二進制數據).
1004 保留. 其意義可能會在將來定義.
1005 CLOSE_NO_STATUS 保留. 表示沒有收到預期的狀態碼.
1006 CLOSE_ABNORMAL 保留. 用於指望收到狀態碼時鏈接非正常關閉 (也就是說, 沒有發送關閉幀).
1007 Unsupported Data 因爲收到了格式不符的數據而斷開鏈接 (如文本消息中包含了非 UTF-8 數據).
1008 Policy Violation 因爲收到不符合約定的數據而斷開鏈接. 這是一個通用狀態碼, 用於不適合使用 1003 和 1009 狀態碼的場景.
1009 CLOSE_TOO_LARGE 因爲收到過大的數據幀而斷開鏈接.
1010 Missing Extension 客戶端指望服務器商定一個或多個拓展, 但服務器沒有處理, 所以客戶端斷開鏈接.
1011 Internal Error 客戶端因爲遇到沒有預料的狀況阻止其完成請求, 所以服務端斷開鏈接.
1012 Service Restart 服務器因爲重啓而斷開鏈接.
1013 Try Again Later 服務器因爲臨時緣由斷開鏈接, 如服務器過載所以斷開一部分客戶端鏈接.
1014 由 WebSocket標準保留以便將來使用.
1015 TLS 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在正則表達式行爲方面有點異常。websocket

// 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. 參考

相關文章
相關標籤/搜索