淺談Websocket、Ajax輪詢和長輪詢(long polling)


淺談Websocket、Ajax輪詢和長輪詢(long p0ll)

  最近看到了一些介紹Websocket的文章,覺得挺有用,所以在這里將自己的對其三者的理解記錄一下。

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請求,查詢服務器端是否有數據更新
      客戶端:有沒有新消息
      服務器端:沒有。。
      客戶端:有沒有新消息
      服務器端:有,xxxxx
      客戶端:有沒有新消息
      服務器端:沒有。。
      客戶端:有沒有新消息
      服務器端:沒有。。
      。。。。。。
  其缺點顯而易見,每次都要建立HTTP連接,即使需要傳輸的數據非常少,所以這樣很浪費帶寬;同時,這個過程是被動性的,即不是服務器主動推送的。
6.長輪詢(long poll)
      客戶端:有沒有新信息(Request)
      服務端:沒有,
      (時間一直的流逝。。。,當等待到有消息的時候)
      服務器端:給你xxxx(Response)
      客戶端:有沒有新消息(Request)
      。。。。。
  其缺點也是顯而易見的,同ajax輪詢一樣,也是每次都要建立HTTP連接,也都是被動的。而且這種方法對服務器的並行要求比較大,因為在沒有消息的時候,連接照樣保持,而這時需要其它信息是又要建立新的連接(就連接保持中)。
7.參考:
  a.百度
  b.http://www.zhihu.com/question/20215561/answer/40316953

 

 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM