1. 程式人生 > >淺談Websocket、Ajax輪詢和長連接(long pull)

淺談Websocket、Ajax輪詢和長連接(long pull)

服務器推 .ajax get 版本 其中 img request 結果 服務

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的版本號。 當服務器接收到上述包後,會返回一下內容:
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連接就建立了。

4.Websocket怎麽工作的

      客戶端:我要建立websocket連接       服務器端:好的,已經切換到websocket協議,websocket連接已經建立         客戶端:有什麽消息要及時告訴(推送
)我        服務器端:好的        服務器端:xxxxxx        服務器端:yyyyyyy        。。。。。   其優點就是,只要建立一次連接,就可以連續不斷的得到服務器推送的消息,節省帶寬和服務器端的壓力。

5.Ajax輪詢怎麽實現的

  其實,這個大多數小夥伴都知道了,ajax輪詢模擬長連接就是每個一段時間(0.5s)就向服務器發起ajax請求,查詢服務器端是否有數據更新       客戶端:有沒有新消息       服務器端:沒有。。(第一次http結束)       客戶端:有沒有新消息       服務器端:有,xxxxx (第二次http結束)       客戶端:有沒有新消息       服務器端:沒有。。 (第三次http結束)       客戶端:有沒有新消息       服務器端:沒有。。 (第四次http結束)       。。。。。。   其缺點顯而易見,每次都要建立HTTP連接,即使需要傳輸的數據非常少,所以這樣很浪費帶寬;同時,這個過程是被動性的,即不是服務器主動推送的。

6.長連接(long pull)

      客戶端:有沒有新信息(Request)--第一次http請求開始
      服務端:沒有信息,不作回應       (時間一直的流逝。。。一直保持http連接,當等到有消息的時候)       服務器端:給你xxxx(Response)--這時,第一次的http請求獲得想要的結果,然後還要發起第二、三。。次http請求       客戶端:有沒有新消息(Request)--第二次http請求開始       。。。。。   其缺點也是顯而易見的,同ajax輪詢一樣,也是每次都要建立HTTP連接,也都是被動的。而且這種方法對服務器的並行要求比較大,因為在沒有消息的時候,連接照樣保持,而這時需要其它信息是又要建立新的連接(就連接保持中)。

淺談Websocket、Ajax輪詢和長連接(long pull)