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