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流推送目前一般采用:
- 隱藏IFrame(Hidden iframe)
服務(wù)器端一般會(huì)輸出一段javascript腳本<script>comet.showMsg(“這是新的消息”)</script>
好處在于各個(gè)瀏覽器都支持iframe,目前在IE、Firefox下面效果最好,頁(yè)面不再顯示正在加載中的討厭的提示(見(jiàn)Servlet 3.0筆記之異步請(qǐng)求Comet推送iFrame示范) - 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)形式:
- XHR方式長(zhǎng)輪詢(XMLHttpRequest long polling)
服務(wù)器端可以返回原始的數(shù)據(jù),也可以返回格式化的JSON、XML、JAVASCRIPT信息,相比iframe形式流推送,更自由一些。使用形式和傳統(tǒng)意義上的AJAX GET方式大致一樣,只不過(guò)下一次的輪詢需要等到有數(shù)據(jù)返回處理完方可。
默認(rèn)不支持跨域,實(shí)踐中會(huì)打折扣。 - 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)用中十分廣泛,變體也很多。
參考資料:
posted on 2011-02-27 17:17 nieyong 閱讀(2734) 評(píng)論(0) 編輯 收藏 所屬分類: Servlet3