瀏覽原文:https://wdd.js.org/websocket-…
1. 把毛病打印出來
WebSocket斷開的緣由有許多,最幸虧WebSocket斷開時,將毛病打印出來。
在線demo地點:https://wdd.js.org/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
3. 封閉狀況碼錶
平常來說1006
的毛病碼湧現的狀況比較罕見,該毛病碼平常湧現在斷網時。
狀況碼 | 稱號 | 形貌 |
---|---|---|
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在正則表達式行動方面有點非常。
// 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('')
}