淺談Websocket、Ajax輪詢和長連接(long pull)
阿新 • • 發佈:2018-11-16
服務器推 .ajax get 版本 其中 img request 結果 服務
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
它告訴客戶端,我已經切換到websocket協議了,Sec-WebSocket-Accept就是Sec-WebSocket-Key加密後的內容,這樣,一個websocket連接就建立了。
)我
服務器端:好的
服務器端:xxxxxx
服務器端:yyyyyyy
。。。。。
其優點就是,只要建立一次連接,就可以連續不斷的得到服務器推送的消息,節省帶寬和服務器端的壓力。
客戶端:有沒有新信息(Request)--第一次http請求開始
服務端:沒有信息,不作回應 (時間一直的流逝。。。一直保持http連接,當等到有消息的時候) 服務器端:給你xxxx(Response)--這時,第一次的http請求獲得想要的結果,然後還要發起第二、三。。次http請求 客戶端:有沒有新消息(Request)--第二次http請求開始 。。。。。 其缺點也是顯而易見的,同ajax輪詢一樣,也是每次都要建立HTTP連接,也都是被動的。而且這種方法對服務器的並行要求比較大,因為在沒有消息的時候,連接照樣保持,而這時需要其它信息是又要建立新的連接(就連接保持中)。
1.什麽是Websocket
Websocket是HTML5中提出的新的協議,註意,這裏是協議,可以實現客戶端與服務器端的通信,實現服務器的推送功能。
2.Websocket和HTTP協議是什麽關系
簡單來說,Websocket和HTTP有關系,但是關系不大,它們的關系類似於數學中的交集,如下圖(借用的Ovear的圖)。Websocket借用了HTTP協議來完成一部分握手過程。
3.Websocket的握手過程
當客戶端要建立Websocket連接時,其向服務器發送:
GET /chat HTTP/1.1 Host: xxx.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://xxx.com 其中,Upgrade: websocket和Connection: Upgrade告訴服務器,我要建立的是websocket連接;Sec-WebSocket-Key部分服務器加密後還要返回瀏覽器,確保建立的是websocket連接;Sec-WebSocket-Version: 13是websocket的版本號。 當服務器接收到上述包後,會返回一下內容:4.Websocket怎麽工作的
客戶端:我要建立websocket連接 服務器端:好的,已經切換到websocket協議,websocket連接已經建立 客戶端:有什麽消息要及時告訴(推送5.Ajax輪詢怎麽實現的
其實,這個大多數小夥伴都知道了,ajax輪詢模擬長連接就是每個一段時間(0.5s)就向服務器發起ajax請求,查詢服務器端是否有數據更新 客戶端:有沒有新消息 服務器端:沒有。。(第一次http結束) 客戶端:有沒有新消息 服務器端:有,xxxxx (第二次http結束) 客戶端:有沒有新消息 服務器端:沒有。。 (第三次http結束) 客戶端:有沒有新消息 服務器端:沒有。。 (第四次http結束) 。。。。。。 其缺點顯而易見,每次都要建立HTTP連接,即使需要傳輸的數據非常少,所以這樣很浪費帶寬;同時,這個過程是被動性的,即不是服務器主動推送的。6.長連接(long pull)
服務端:沒有信息,不作回應 (時間一直的流逝。。。一直保持http連接,當等到有消息的時候) 服務器端:給你xxxx(Response)--這時,第一次的http請求獲得想要的結果,然後還要發起第二、三。。次http請求 客戶端:有沒有新消息(Request)--第二次http請求開始 。。。。。 其缺點也是顯而易見的,同ajax輪詢一樣,也是每次都要建立HTTP連接,也都是被動的。而且這種方法對服務器的並行要求比較大,因為在沒有消息的時候,連接照樣保持,而這時需要其它信息是又要建立新的連接(就連接保持中)。
淺談Websocket、Ajax輪詢和長連接(long pull)