iPhone學習之路 基于HTTP長連接Server PUSH
iPhone學習之路 基于HTTP長連接Server PUSH是本文要介紹的內容,本文主要是圍繞長連接Server PUSH介紹,不多說,我們來看內容。
服務器推實現的相關資料
有個不錯的文章《Comet:基于 HTTP 長連接的“服務器推”技術》。文章提到Comet現實應用的需求:
監控系統:后臺硬件熱插拔、LED、溫度、電壓發生變化;
即時通信系統:其它用戶登錄、發送信息;
即時報價系統:后臺數據庫內容發生變化;
也提到多種技術實現服務器推送。
我現在比較同意這個,介紹了選擇要注意的事項,比如服務器對long-polling的支持。現在主要關心:
如果數據推送頻率不高,并發壓力不大,可以用基于 AJAX 的長輪詢(long-polling)方式,實現比較簡單。nginx有個Module可以支持long-polling,可能以后還支持Streaming。long-polling每次返回數據后是要再次請求。
如果數據變化快,想以推送為主,可以用基于 Iframe 及 htmlfile 的流(streaming)方式。這里有比較不錯的介紹,里邊還介紹了APE等一些服務器實現,要根據具體情況來選擇。比如APE是C實現的,我是用java的,對我來說它不容易擴展(基本javascript的擴展性能可靠性能實現的功能要測試,對于實在想走80端口,這個是我目前找到的功能全,而且官方說支持100K+并發,但是目前資料少,說明用的人不多啊)。
APE1.0主要還是long-polling,流方式使用XHRStreaming在IE上不行;相比而言streamHub流是使用寫<script>標簽實現的,可以跨瀏覽器。那些不開源的不要說了,python也不熟悉,Jetty 6 和 Tomcat 6已經支持Comet,一般情況可以滿足,并發太大了也要做選擇,有人用netty自己實現,支持10萬以上。想自己寫服務器看這個用xsocket實現了。
2010.5補充:以前對長連接和http persistent connection沒有太清晰的概念,在腦子里老是把請求和tcp連接混在一塊想。long-polling方式在firebug里能看到一個請求及數據返回響應,然后再請求,但都是同一tcp連接(支持http1.1的服務器)。像streamHub那樣用流方式的,我們看到一個返回響應數據不斷漲,可通過其它請求,改變這一響應數據內容。以前錯誤的認為:這樣一個響應才是同一連接,long-polling會重新建立tcp連接。
出于性能或其它原因,有些應用比較適合用socket。B/S結構客戶端可以用flash,以后HTML5,也是不錯的選擇。看這里文章中提到:
自己實現的server通常存在性能及可擴展性的問題,因此實現全部功能需要投入大量的開發精力。Hemlock通過flash長連到XMPP Server上。由于XMPP Server(如openfire, ejabberd等)本身就支持多服務器,因此使用默認的版本就可以支持上十萬的并發,如果稍加優化,同時支持上百萬用戶也不會有太大問題。
openfire開源的,基于mina實現 (喜歡java代碼的也可以看看red5或者http://code.google.com/p/gfs-server/)
再加幾個基于netty的開源項目:
http://openr66.free.fr/GoldenGateFTP.html
http://code.google.com/p/jmemcache-daemon/
http://kevwil.github.com/aspen/
http://code.google.com/p/sensei-search/
(看到過的資料單機2*4core 16GB實現近50萬在線連接,每秒處理近10萬請求,c實現,內核,網卡等都經過優化;看過java***的就是Using Netty we have comet running on 100.000+ open connections - this uses some GB of memory and 20% of CPU on a quad core server.一個四核服務器10萬以上連接)
小結:詳解基于HTTP長連接Server PUSH的內容介紹完了,希望本文對你有所幫助!