摘要:最近對服務(wù)器推送技術(shù)比較感興趣,在網(wǎng)上也看了好些文章,由于每個人理解的不同,實現(xiàn)細節(jié)或者語言表達方式不同,本人被各種名詞或者技術(shù)實現(xiàn)搞的頭大,于是自己準備整理下。定時器就可以實現(xiàn),每次請求如果服務(wù)器端有更新數(shù)據(jù)則響應(yīng)到客戶端。
最近對服務(wù)器推送技術(shù)比較感興趣,在網(wǎng)上也看了好些文章,由于每個人理解的不同,實現(xiàn)細節(jié)或者語言表達方式不同,本人被各種名詞或者技術(shù)實現(xiàn)搞的頭大,于是自己準備整理下。
首先實現(xiàn)服務(wù)器推送技術(shù)一直一來是B/S應(yīng)用開發(fā)的一塊難題,因為是基于HTTP協(xié)議的,HTTP協(xié)議為無狀態(tài),單向性的協(xié)議,這種情況導(dǎo)致只有客戶端請求,服務(wù)器才能被動響應(yīng)結(jié)果,雖然HTTP協(xié)議的優(yōu)勢是很大的,高效,高伸縮性等。但是有優(yōu)勢自然有不足,譬如我想做個聊天室,這種情況導(dǎo)致服務(wù)器無法主動向客戶端推送消息,這就有了瓶頸。
....于是人們就開始尋找各種解決方案了。
一種就是控制客戶端的頁面不斷的進行ajax請求,應(yīng)該很好實現(xiàn)吧。js定時器就可以實現(xiàn),每次請求如果服務(wù)器端有更新數(shù)據(jù)則響應(yīng)到客戶端。但是這會造成服務(wù)器的嚴重壓力,如果在線用戶數(shù)量過多的話,每隔個一兩秒請求一次,哪個服務(wù)器能受得了,這種肯定不太現(xiàn)實,或者是最無奈的實現(xiàn)方法。
于是出現(xiàn)了 comet ,comet技術(shù)是服務(wù)器推技術(shù)的一個總稱,但不是具體實現(xiàn)方式。下面我將會講兩種實現(xiàn)方式,是基于HTTP長連接的實現(xiàn)。
第一種叫做長輪詢(long-polling)方式,它同樣使用的ajax,簡單說一下,就是客戶端使用ajax發(fā)送一個請求,服務(wù)器端肯定會開啟一個線程,這個線程會時時監(jiān)測要請求的數(shù)據(jù)是否有變化,如果有變化,則向客戶端輸出最新消息,并關(guān)閉鏈接,客戶端收到消息處理之后,再次向服務(wù)器端請求,如此循環(huán),所以叫長輪詢,這種實現(xiàn)方式比起上一種自然要好的多了,不需要客戶端不斷的ajax請求,減輕服務(wù)器端的一定壓力,而且可以算得上是實時的。
另外一種是流方式,這種和長輪詢方式挺像,只有一點區(qū)別,就是流方式是在客戶端請求服務(wù)端并建立鏈接之后,服務(wù)器端始終不會關(guān)閉鏈接(直到超時,斷電或者其他特殊情況)每次有數(shù)據(jù)時,就向客戶端進行輸出,而不像長輪詢每次向客戶端輸出之后,都要關(guān)閉鏈接。
關(guān)于長輪詢和流方式注意以下:
在長輪詢方式下,客戶端是在 XMLHttpRequest 的 readystate 為 4(即數(shù)據(jù)傳輸結(jié)束)時調(diào)用回調(diào)函數(shù),進行信息處理。當 readystate 為 4 時,數(shù)據(jù)傳輸結(jié)束,連接已經(jīng)關(guān)閉,長輪詢方式IE、Mozilla FireFox 都支持。而至于流方式,Mozilla Firefox 提供了對流方式的支持,即 readystate 為 3 時(數(shù)據(jù)仍在傳輸中),客戶端可以讀取數(shù)據(jù),從而無須關(guān)閉連接,就能讀取處理服務(wù)器端返回的信息。IE 在 readystate 為 3 時,不能讀取服務(wù)器返回的數(shù)據(jù),目前 IE 不支持流方式。
comet實現(xiàn)瓶頸解決——服務(wù)器servlet線程阻塞問題
到這里大家可能會想到另外一個問題,那就是客戶端每來一個請求,都要在服務(wù)器端開一個線程來監(jiān)測數(shù)據(jù)是否發(fā)生變化,即使數(shù)據(jù)很長時間內(nèi)都不會發(fā)生改變,這條線程依然
在這里阻塞著,資源不能得到釋放,線程在這里又沒其他事干,如果有過多的用戶、過多的線程,自然會造成服務(wù)器的資源,內(nèi)存不足的情況。這是個問題,不過既然有問題,自然有解決方法。
目前有兩種解決方法,第一種是利用Tomcat 和 Jetty這兩種開源服務(wù)器對NIO的支持 代碼實現(xiàn)和添加服務(wù)器支持可以參考http://www.ibm.com/developerw...,第二種則是Java 1.6 出來的Servlet3.0,Servlet3.0可以實現(xiàn)真正的異步處理,就是新開一個線程用于處理復(fù)雜業(yè)務(wù),而servlet線程本身則繼續(xù)往下執(zhí)行直到結(jié)束之后,再返回servlet容器,待到另一條線程業(yè)務(wù)處理完之后,再向客戶端輸出結(jié)果。但是使用servlet3.0,需要tomcat7和以上才支持,servlet3.0的實現(xiàn)百度就有好多,就不在此多贅述了。只談理論。。。
參考:http://www.ibm.com/developerw...
https://software.intel.com/zh...
http://www.itjhwd.com/comet-j...
https://www.cnblogs.com/wodem...【有案例】
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/109041.html
摘要:最近對服務(wù)器推送技術(shù)比較感興趣,在網(wǎng)上也看了好些文章,由于每個人理解的不同,實現(xiàn)細節(jié)或者語言表達方式不同,本人被各種名詞或者技術(shù)實現(xiàn)搞的頭大,于是自己準備整理下。定時器就可以實現(xiàn),每次請求如果服務(wù)器端有更新數(shù)據(jù)則響應(yīng)到客戶端。 最近對服務(wù)器推送技術(shù)比較感興趣,在網(wǎng)上也看了好些文章,由于每個人理解的不同,實現(xiàn)細節(jié)或者語言表達方式不同,本人被各種名詞或者技術(shù)實現(xiàn)搞的頭大,于是自己準備整理下...
摘要:由兩部分組成回調(diào)函數(shù)和數(shù)據(jù)。回調(diào)函數(shù)是當響應(yīng)到來時應(yīng)該在頁面中調(diào)用的函數(shù),回調(diào)函數(shù)的名字一般是在請求中指定的。下面是以個的例子回調(diào)函數(shù)的名字就是是通過動態(tài)的元素來使用的,使用時可以為屬性指定一個跨域。是為與其他傳遞消息的很相似。 圖像Ping技術(shù) 根據(jù)一個網(wǎng)頁可以從任何網(wǎng)頁中加載圖像而不用擔心使用跨域的原理, 我們可以動態(tài)的創(chuàng)建圖像, 使用他們的onload和onerror事件處理程序...
摘要:注意實際上指的是一種協(xié)議,與我們熟知的協(xié)議是同等的一個網(wǎng)絡(luò)協(xié)議。協(xié)議與的聯(lián)系是指的一系列新的,或者說新規(guī)范,新技術(shù)。注意下面的請求報文與響應(yīng)報文中的內(nèi)容不是完整的報文,而是基于請求響應(yīng)報文添加的內(nèi)容。 背景 以前的網(wǎng)站為了實現(xiàn)推送功能,使用的方法都是輪詢。所謂的輪詢就是在特定的時間間隔(例如1秒),由瀏覽器向服務(wù)器發(fā)出一個 Http request,然后服務(wù)器返回最新的數(shù)據(jù)給客戶端瀏覽...
閱讀 3398·2023-04-25 22:04
閱讀 2197·2021-11-22 15:29
閱讀 2161·2021-10-11 10:57
閱讀 1402·2021-09-24 09:48
閱讀 3147·2021-09-09 09:34
閱讀 2543·2021-09-02 15:21
閱讀 2393·2019-08-30 15:53
閱讀 1120·2019-08-30 14:07