標籤:
很早就想寫一些關於網頁訊息即時推送技術方面的文章,但是由於最近實在忙,沒有時間去寫文章。本文主要講解基於 HTTP1.1 協議的 WEB 推送的技術原理及實現。本人曾經在工作的時候也有做過一些用到網頁訊息即時推送的項目,但是當時實現的都不是很完美,甚至有時候是通過 Ajax 輪訓的方式實現。在網上也找過不少的資料,真正說到點子上的幾乎沒有,很多文章大都是長篇大論,說了一些新有名字,什麼“HTTP 長串連”,“即時推送”,“Comet 長串連推送技術”等。但真正提到如何?即時推送的文章倒是沒有看到過。
我的一個開源項目 WebChat,是一個基於網頁的聊天室系統,這個系統是本人畢業前做的,代碼一直沒放到 GITHUB 上。因為本人畢業論文設計是一款基於安卓平台的即時推送的應用,開發完安卓推送系統後讓我對推送有了更深認識,到後來畢業論文結束後就想著要將聊天室項目公開,最近放到了 GITHUB 上,取了個名字叫 WebChat,一開始還想叫 WeChat,後來感覺很俗,當時也想不出好名字,感覺只要是像樣的英文單詞都被佔有了。WebChat 的 git 地址是 [email protected]:leiminglin/WebChat.git,服務端使用 PHP 實現,前端使用了 JavaScript,JQuery。這裡談到這個項目主要是因為 WebChat 用到了推送技術,想學習的朋友可以下載看看,該項目可以運行在幾乎所有瀏覽器上,本人測試 IE6 都沒問題。
說到網頁推送,不得不說 Flash 的 WebSocket,這個應該比 HTTP 實現的要好,但是現在 HTML5 出來了,Flash 慢慢的也將淡出曆史舞台。其實有很多的網頁訊息推送應用,在 HTML5 之前,用的比較多的還是 Flash,比如百度商橋吖,新浪微博吖等等。但這些出名的應用也不全都使用 Flash 實現,之前發現 WebQQ 的推送是使用 HTTP 實現的,但是也不排除有部分模組不是使用的是 Flash。
關於如何?訊息即時推送,能想到的前提一定是長串連,如果沒有一個串連在保持著,如何知道訊息已經到了呢。所以要即時也是需要花費代價的,伺服器需要保持用戶端的連結。在使用 HTTP 實現即時推送之前,我們需要瞭解 HTTP 協議,HTTP1.1 是支援長串連的,但是 HTTP 是沒有狀態的,一次請求,伺服器給予響應,這個請求就結束了,不久之後就會中斷連線,不可以在這個串連基礎上再回應,然後再接收,要真是這樣就成了 Socket 通訊了。要在這個基礎上實現訊息即時推送,必須要有一個串連發出請求然後在等待訊息,就讓它一直在等待,一旦接收到了訊息回應立即發出下一個請求。剩下的事情就是服務端的事情了,服務端需要有個 Socket 服務在偵聽用戶端的長串連請求和發訊息的指令,這樣就可以實現即時訊息推送了,這種方式實現的推送比 Ajax 輪訓要好的多,在即時要求比較高的情況下,比如聊天,訂單支付等情況下比輪訓的方式更加節省資源,在時間上也讓使用者感覺不到訊息有的任何延遲。
基於HTTP協議之WEB訊息即時推送技術原理及實現