WebSocket
html 頁面在剛剛開始出現的時候是靜態的,不能進行互動,直到Ajax的出現,但是所有的請求都必須由客戶端發起,服務端響應,如果服務端有最新訊息,難以傳送到客戶端去,在WebSocket 基數出現前,為了讓客戶端能夠即時的獲取服務端的資料,一般採用如下三種方案:
- 輪詢
這是最簡單的一種解決方案,客戶端在固定的時間間隔下,不停的向服務端傳送請求,檢視服務端是否有最新的資料,服務端如果有最新的資料則返回給客戶端,服務端如果沒有則返回一個空的 json 或者 xml 文件,這種方式實現簡單,但是弊端明顯,會有大量無效請求,浪費服務端資源。
- 長連線
長連線有點類似於輪詢,不同的是服務端不是每次都會響應客戶端的請求,只有在服務端有新資料的時候才會響應客戶端的請求,這種方式節省資源,但是也存在一些問日,比如:1. 如果瀏覽器在伺服器響應之前有新資料要傳送就只能建立一個新的併發請求,或者先嚐試斷掉當前請求然後再建立新的請求。2. TCP和HTTP 規範中都有連線超時,所以長連線蹦年一直持續,客戶端和服務端的連線需要定期的連線和關閉再連線。
- Applet 和 Flash
Applet 可以內嵌到瀏覽器中去執行,但是瀏覽器必須能夠執行Java或者Flash,無論是Applet還是Flash都存在安全問題,隨著Html5在標準瀏覽器中廣泛支援,Flash下架已經被提上日程
WebSocket特點
- HTTP/1.1 的升級特性
在所有的 HTTP 客戶端都可以在請求頭中包含 Connection:Upgrade,這個表示客戶端希望升級請求協議。我們需要在 Upgrade 頭中指定一個或多個協議的列表,這些協議必須相容HTTP/1.1 協議,伺服器收到請求後,如果接受升級請求,那麼將會返回一個101的狀態碼,表示轉換請求協議,同時在 Upgrade 頭中使用單個值。最大的好處就是最終使我們可以使用任意的協議,在升級握手完成之後,建立一個Socket連線。
- 使用 HTTP/1.1升級的WebSocket協議
一個WebSocket 請求首先使用非正常的HTTP請求以特定的模式訪問一個URL,這個URL有兩種模式,分別是ws和wss,對應 http 和 https。請求頭中除了Connextion:Upreade 之外還有一個 Upgrade:websocket,他們共同告訴伺服器將連線升級為WebSocket這樣一種全雙工協議。如此,在握手完成之後,文字訊息或者其他二進位制訊息就可以在兩個方向上進行傳送,而不需要關閉和重建連線。
- WebSocket 協議的優勢
1. WebSocket 連線在埠80(ws)或者443(wss)上建立,與HTTP使用的埠相同,基本上所有的防火牆都不會阻塞WebSocket連線
2. 使用HTTP協議進行握手,因此它可以自然而然的整合到網路瀏覽器和HTTP服務中
3. ping 和 pong 將被反覆傳送,進而保持WebSocket 連線幾乎一直處於活躍狀態。
4. 當訊息啟動或者到達時,服務端和客戶端都可以知道
5. 連線關閉時將傳送一個特殊的關閉訊息
6. 支援跨域,可以避免Ajax的限制
7. 當握手完成後就不存在連線數每個主機名兩個連線的限制了,因為此時連線已經不再是HTTP協議了
複製程式碼
- WebSocket的用途