Web消息推送的技術實現

說到Web推送技術,或者IM即時通信技術,因爲瀏覽器各類限制條件,不少狀況下咱們藉助輪詢技術的思想,實際上web推送技術不在少數。html

1.輪詢技術(Pull)html5

輪詢技術具備更多的優勢,其中之一即是兼容性強,有些人把輪詢分爲定時輪詢長輪詢,實際上換湯不換藥,輪詢就是輪詢,改一下調用時機難道就是一種新技術?web

2.基於長鏈接的Comet技術瀏覽器

說的長鏈接技術,聽起來很是高大上,但實際上下面的關係就已經基本上是長鏈接了服務器

客戶端請求websocket

Connection:Keep-Alive

服務端返回異步

Connection:Keep-Alive

那麼,問題來了,Comet到底作了什麼?socket

Comet其實是機制,而不是說的長鏈接,要否則怎麼被稱爲反向Ajax,這個機制是什麼?.net

1.首先咱們確保鏈接都是Keep-Alive,也就是說服務器和客戶端保持Socket鏈接不關閉,不斷開的長鏈接。code

2.咱們須要把服務器端的Socket Client保存起來,必要的時候調用

3.而後咱們經過服務器端的Socket Client向客戶端發送數據

(注意:由於HTTP協議的約定,每次發送的數據必須具備響應頭+響應體,不然瀏覽器沒法識別數據) 

也就是說,Comet不是長鏈接技術,而是一種推送技術,但他要維持長鏈接,基於長鏈接技術。

可是遺憾的是,不少http請求你根本拿不到Socket Client,好在是Servlet3.0實現了能夠將連接Context持有起來的異步通信技術

AsyncContext ac = request.startAsync();

具體用法參考

http://blog.csdn.net/kuyuyingzi/article/details/18843487

3.Server Event技術

Server-Event是HTML5基於事件流的推送技術,這種技術是基於Keep-Alive的輪詢技術?說到這裏你可能糊塗了,Comet也是基於長鏈接,爲何就是反向Ajax,而這種是輪詢呢,其實,Comet自始至終使用的是同一個Socket鏈接,可是Server-Event可不同,他會產生不少Keep-Alive的鏈接,可是使用的時候他會從鏈接池中選擇其一,這就是最本質的區別。

用法參考:

http://www.runoob.com/html/html5-serversentevents.html

4.WebSocket技術

WebSocket協議(RFC6455)其實是長鏈接,這種和Comet比起來可伸縮性比較好,一樣也在Servlet 3.0中實現了,具體用法這裏不說了,想了解詳細信息,請查看以下連接。

http://www.rfc-editor.org/rfc/rfc6455.txt

這裏附上WebSocket協議

Client開始handshake

GET / HTTP/1.1
Connection:Upgrade
Host:127.0.0.1:8088
Origin:null
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==
Sec-WebSocket-Version:13
Upgrade:websocket

Server 完成handshake

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

握手成功,即可進行數據交互

相關文章
相關標籤/搜索