聶永的博客

          記錄工作/學(xué)習(xí)的點(diǎn)點(diǎn)滴滴。

          Servlet 3.0筆記之異步請(qǐng)求重新梳理Comet的幾種形式

          本來(lái)只是想梳理以下Servlet 3.0異步請(qǐng)求,不曾想涉及到Comet(維基百科上面對(duì)comet有具體的定義和介紹),篇章多了起來(lái),對(duì)以往所學(xué)習(xí)和心得,重新梳理一下。
          Comet的實(shí)現(xiàn)主要流(streaming) 形式和長(zhǎng)輪詢(long polling)兩種形式。流和長(zhǎng)輪詢區(qū)別主要在于,在一次連接中,服務(wù)器端推送多次的數(shù)據(jù)為流,只推送一次為長(zhǎng)輪詢。
          流推送(Comet Streaming)
          Comet流推送目前一般采用:
          1. 隱藏IFrame(Hidden iframe)
            服務(wù)器端一般會(huì)輸出一段javascript腳本
            <script>comet.showMsg(“這是新的消息”)</script>

            好處在于各個(gè)瀏覽器都支持iframe,目前在IE、Firefox下面效果最好,頁(yè)面不再顯示正在加載中的討厭的提示(見(jiàn)Servlet 3.0筆記之異步請(qǐng)求Comet推送iFrame示范
          2. XMLHttpRequest
            很可憐,目前支持情況最好的是火狐瀏覽器、IE8以及Safari
            參考文章:
            Servlet 3.0筆記之異步請(qǐng)求Comet推送XMLHttpRequest示范
            Servlet 3.0筆記之異步請(qǐng)求Comet流推送(Streaming)實(shí)現(xiàn)小結(jié)
          長(zhǎng)輪詢(Ajax with long polling)
          客戶端會(huì)與服務(wù)器建立一個(gè)持久的連接,直到服務(wù)器端有數(shù)據(jù)發(fā)送過(guò)來(lái)(超時(shí)也會(huì)發(fā)送數(shù)據(jù)),雙方斷開連接,客戶端處理完推送的數(shù)據(jù),會(huì)再次發(fā)起一個(gè)持久的連接,循環(huán)往復(fù)。其實(shí)現(xiàn)形式:
          1. XHR方式長(zhǎng)輪詢(XMLHttpRequest long polling)
            服務(wù)器端可以返回原始的數(shù)據(jù),也可以返回格式化的JSON、XML、JAVASCRIPT信息,相比iframe形式流推送,更自由一些。使用形式和傳統(tǒng)意義上的AJAX GET方式大致一樣,只不過(guò)下一次的輪詢需要等到有數(shù)據(jù)返回處理完方可。
            默認(rèn)不支持跨域,實(shí)踐中會(huì)打折扣。
          2. JAVASCRIPT標(biāo)簽輪詢(Script tag long polling)
            可能翻譯不太準(zhǔn)確,主要使用類似于如下形式:
            <script src='js/yourCometProvider.js' type='text/javascript'></script>
            使用跨域的JS腳本,可能會(huì)有安全方面隱患,或許這個(gè)間接風(fēng)險(xiǎn)是可控的。
            也可以使用JSONP用以規(guī)避這個(gè)風(fēng)險(xiǎn)。
            進(jìn)階閱讀:Comet (long polling) for all browsers using ScriptCommunicator
            代碼寫的很巧妙,也很簡(jiǎn)短,思路不錯(cuò),推薦一看。
            參考文章:
            Servlet 3.0筆記之異步請(qǐng)求Comet推送長(zhǎng)輪詢(long polling)篇
            Servlet 3.0筆記之異步請(qǐng)求Comet推送長(zhǎng)輪詢(long polling)篇補(bǔ)遺
          Comet瀏覽器支持匯總
          大致總結(jié)一下各個(gè)瀏覽器對(duì)Comet支持大致情況,可能不太科學(xué),僅以自己實(shí)踐中感知為準(zhǔn)。table{border:1px solid #888888;border-collapse:collapse;font-family:Arial,Helvetica,sans-serif;margin-top:10px;width:100%;}table th {background-color:#CCCCCC;border:1px solid #888888;padding:5px 15px 5px 5px;text-align:left;vertical-align:baseline;}table td {background-color:#EFEFEF;border:1px solid #AAAAAA;padding:5px 15px 5px 5px;vertical-align:text-top;}
          瀏覽器 流(streaming)長(zhǎng)輪詢(long polling) 
          IE(6-8) htmlfile + iframe 支持流形式;
          IE8的XDomainRequest支持HTTP Streaming
          支持腳本加載事件;頁(yè)面表現(xiàn)完美
          Firefox(3.5) 支持XMLHttpRequest Streaming 和隱藏的IFrame組件 支持腳本文件async屬性;頁(yè)面表現(xiàn)完美
          Chrome(>9.0) 不支持XMLHttpRequest Streaming;使用IFrame會(huì)一直出現(xiàn)正在加載中圖標(biāo) 支持腳本文件async屬性;頁(yè)面表現(xiàn)完美
          Safari(5) 瀏覽器支持XMLHttpRequest Streaming 支持腳本文件的async屬性;頁(yè)面表現(xiàn)完美
          Opera(>9.0) 不支持XMLHttpRequest Streaming,使用IFrame的話會(huì)一樣會(huì)出現(xiàn)正在加載中的標(biāo)志 本機(jī)測(cè)試腳本文件長(zhǎng)輪詢時(shí)間若長(zhǎng)于20秒,則會(huì)出現(xiàn)連接中斷情況;會(huì)出現(xiàn)正在加載中的標(biāo)志
          Servlet 3.0 支持
          長(zhǎng)輪詢或流推送,相對(duì)于Servlet 3.0 異步請(qǐng)求,相差不大,都需要定義一個(gè)連接超時(shí)時(shí)間,但后者可以向客戶端推送多次,前者推送一次之后需要立刻斷開了與客戶端的連接;在超時(shí)事件發(fā)生后,都可以通知客戶端超時(shí)已發(fā)生。另外在高并發(fā)環(huán)境下可能需要做多層次的消息路由服務(wù)以降低單機(jī)的處理極限。
          實(shí)踐中使用Comet流推送,也需要在一定的時(shí)間后再次重連,或許可以稱之為流輪詢(streaming poll),只是人們沒(méi)有提起而已。
          發(fā)布訂閱模型(Publish/Subscribe)
          Comet為發(fā)布/訂閱模型在前端應(yīng)用的一種變形。可以很直觀的將服務(wù)器端視為內(nèi)容發(fā)布者,瀏覽器端為訂閱者。相對(duì)于谷歌的pubsubhubbub協(xié)議,區(qū)別在于Comet使用HTTP 1.1 長(zhǎng)連接協(xié)議,客戶端為瀏覽器,沒(méi)有公開的可回調(diào)的客戶端地址。而pubsubhubbub則要求訂閱者有一個(gè)可以回調(diào)的URL地址(這個(gè)URL對(duì)于發(fā)布者服務(wù)器是直達(dá)的),一旦有新的可用數(shù)據(jù),可以推送到客戶端,客戶端某個(gè)URL監(jiān)聽就是。雙方在用途、使用環(huán)境上不相同,需要區(qū)別對(duì)待。
          話說(shuō)觀察者模式在實(shí)際應(yīng)用中十分廣泛,變體也很多。
          參考資料:
          觀察者模式在線版:訂閱-發(fā)布模型的在線示范

          posted on 2011-02-27 17:17 nieyong 閱讀(2734) 評(píng)論(0)  編輯  收藏 所屬分類: Servlet3

          公告

          所有文章皆為原創(chuàng),若轉(zhuǎn)載請(qǐng)標(biāo)明出處,謝謝~

          新浪微博,歡迎關(guān)注:

          導(dǎo)航

          <2011年2月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272812345
          6789101112

          統(tǒng)計(jì)

          常用鏈接

          留言簿(58)

          隨筆分類(130)

          隨筆檔案(151)

          個(gè)人收藏

          最新隨筆

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 西昌市| 天津市| 阿巴嘎旗| 宜昌市| 安丘市| 楚雄市| 赤水市| 博野县| 方正县| 张家界市| 静海县| 肃北| 阿尔山市| 益阳市| 宁明县| 黔西县| 凤庆县| 大关县| 锦屏县| 钟祥市| 洪泽县| 专栏| 邳州市| 郎溪县| 漳平市| 木里| 商城县| 东辽县| 贵德县| 汉源县| 萝北县| 西盟| 杨浦区| 灵宝市| 花莲县| 德安县| 辰溪县| 汕尾市| 新丰县| 昌乐县| 铜山县|