html5 websocket
全雙工交互
全雙工通信:建立持久連接,服務端和客戶端可隨時互相發送消息
低延遲:適合實時應用(聊天、游戲、股票行情等)
socket協議是與HTTP協議平級的,websocket協議是建立在TCP協議之上的,默認端口是80和443,與HTTP協議兼容,可通過HTTP協議的升級機制來建立websocket連接
- 工作原理:
握手,客戶端和服務器通過HTTP協議交換信息,以確認彼此支持websocket協議。
握手成功后,就可在同一個TCP連接上進行數據的雙向傳輸
支持文本和二進制數據的傳輸
沒有同源限制,允許客戶端與任何服務器通信,斷線檢測
new WebSocket(‘wss://example.om/scoket’).onMessage = (event) => { … }
websocket通過flash
HTTP長輪詢(Long Polling)
最大兼容性
客戶端發送請求,服務端保持連接直到有數據可發送,收到響應后,客戶端立即發起新請求
優點:異步請求,客戶端易實現錯誤處理系統和超時管理。實時性較好,能支持大量用戶,斷線檢測
缺點:需服務器端有特殊功能臨時掛起連接,但具有一定風險且失去了無狀態高并發特點
HTTP流(HTTP streaming)
保持單個HTTP連接開發,服務器端通過同一連接持續發送數據,使用Transfer-Encoding:Chunked
不可見的iframe
不推薦
使用iframe加載一個隱藏網頁,利用瀏覽器一邊加載,一邊解析執行返回的HTML,通過分次返回script標簽來實現消息推送。創建長連接,但服務器開銷大,且IE、chrome等瀏覽器會一直處于loading狀態
優點:每次數據傳送不會關閉連接,連接只會在通信出現錯誤時,或連接重建時關閉,斷線檢查,實時
可跨域
Server-Sent Event(SSE)
簡單實時更新
單向通信:服務端向客戶端推送,一次請求,N次推送
基于HTTP:比websocket更簡單,自動重連
- 工作原理
服務器向客戶端發送一個持久的連接,可以不斷的向客戶端發送數據。客戶端可實時推送數據到前端,斷線檢測
支持自定義事件:服務器可發送帶自定義事件類型的數據,客戶端通過addEventListener監聽這這些事件
支持文本數據:默認支持文本數據,如需二進制數據,要編碼
兼容性較好,適用于實時通知,實時監控,實時數據展示等
new EventSource(‘/update’).onMessage = (event) => { … }
服務器端設置HTTP響應頭,content-type:text/event-stream
短輪詢
每個一段時間發起一個請求到后端詢問是否有新信息,性能浪費較高
web worker
允許js在后臺線程中運行腳本的技術,避免阻塞主線程。運行在與主頁分離的環境中,不能直接操作DOM或訪問window對象中某些方法和屬性。
可用于實現實時通信,如聊天應用中的消息推送