實時消息的推送,pc端的推送技術可以使用socket建立一個長連接配接來實作。傳統的web服務都是用戶端送出請求,服務端給出響應。但是現在直覺的要求是允許特定時間内在沒有用戶端發起請求的情況下服務端主動推送消息到用戶端。
有哪些可以實作web消息推送的技術:
不斷地輪詢(俗稱“拉”,polling)是擷取實時消息的一個手段:ajax 隔一段時間(通常使用 javascript 的 settimeout 函數)就去伺服器查詢是否有改變,進而進行增量式的更新。但是間隔多長時間去查詢成了問題,因為性能和即時性造成了嚴重的反比關系。間隔太短,連續不斷的請求會沖垮伺服器,間隔太長,務器上的新資料就需要越多的時間才能到達客戶機。
優點:服務端邏輯簡單;
缺點:其中大多數請求可能是無效請求,在大量使用者輪詢很頻繁的情況下對伺服器的壓力很大;
應用:并發使用者量少,而且要求消息的實時性不高,一般很少采用;
長輪詢技術(long-polling):用戶端向伺服器發送ajax請求,伺服器接到請求後hold住連接配接,直到有新消息或逾時(設定)才傳回響應資訊并關閉連接配接,用戶端處理完響應資訊後再向伺服器發送新的請求。
優點:實時性高,無消息的情況下不會進行頻繁的請求;
缺點:伺服器維持着連接配接期間會消耗資源;
基于iframe及htmlfile的流(streaming)方式:iframe流方式是在頁面中插入一個隐藏的iframe,利用其src屬性在伺服器和用戶端之間建立一條長連結,伺服器向iframe傳輸資料(通常是html,内有負責插入資訊的javascript),來實時更新頁面。
優點:消息能夠實時到達;
缺點:伺服器維持着長連接配接期會消耗資源;
插件提供socket方式:比如利用flash xmlsocket,java applet套接口,activex包裝的socket。
優點:原生socket的支援,和pc端和移動端的實作方式相似;
缺點:浏覽器端需要裝相應的插件;
websocket:是html5開始提供的一種浏覽器與伺服器間進行全雙工通訊的網絡技術。
優點:更好的節省伺服器資源和帶寬并達到實時通訊;
缺點:目前還未普及,浏覽器支援不好;
綜上,考慮到浏覽器相容性和性能問題,采用長輪詢(long-polling)是一種比較好的方式。
以下是一個來自netty-socketio的推送示例,web聊天系統。
伺服器端push server:
消息實體:
view code
監聽事件:
推送服務:
浏覽器端client:
用戶端聊天代碼:
先運作push server,再打開chat html就可以看到連接配接資訊和伺服器推送的聊天資訊。
參考:
https://github.com/mrniko/netty-socketio
https://github.com/mrniko/netty-socketio-demo
本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。
http://www.cnblogs.com/luxiaoxun/p/4279997.html