IT技(ji)術(shu)互動交流平台

体彩天下官网

來源︰IT165收集  發布日期︰2020-02-19 08:49:29

Comet模式是(shi)一種服務(wu)器(qi)端推技(ji)術(shu),它的核心思想提供(gong)一種能讓(rang)當服務(wu)器(qi)端往客戶端發送數據(ju)的方式。Comet模式為(wei)什麼會出現?剛開始人們(men)在客戶端通過不斷自動刷新整個頁面來更(geng)新數據(ju),後來覺得體驗不好又(you)使用了(liao)AJAX不斷從(cong)客戶端輪(lun)詢(xun)服務(wu)器(qi)更(geng)新數據(ju),然(ran)後是(shi)使用Comet模式jie)煞wu)器(qi)端通過長連接(jie)推數據(ju)。Comet模式能大(da)大(da)減少發送到服務(wu)器(qi)端的請求從(cong)而避免了(liao)很(hen)多開銷(xiao),而且它還(huai)具備更(geng)好的實時性。

如圖所(suo)示(shi),客戶端發送一個請求到服務(wu)器(qi),服務(wu)器(qi)接(jie)收了(liao)連接(jie)後一直保持住連接(jie)不huai)乇眨喚jie)著客戶端發送一個操作報文告訴服務(wu)器(qi)需要做什麼操作,服務(wu)器(qi)處理完事件1後會給客戶端響應,然(ran)後處理完事件2後又(you)會給客戶端響應;然(ran)後客戶端繼續發送操作報文給服務(wu)器(qi),服務(wu)器(qi)再進行響應。

Comet模式

一般(ban)Comet模式需要NIO配合(he),而在BIO中無法使用Comet模式。在Tomcat內部(bu)集成Comet模式的思路也比較清晰,引入了(liao)一個CometProcessor接(jie)口,此接(jie)口只有一個event方法,具體接(jie)口代碼如下(xia)︰

public interface CometProcessor extends Servlet{ public void event(CometEvent event) throws IOException, ServletException;}

而CometEvent則表(biao)示(shi)Comet相關的事件,它包含四BEGIN, READ, END, ERROR四個事件,分(fen)別表(biao)示(shi)︰
? BEGIN,表(biao)示(shi)請求開始,此時客戶端連接(jie)已被接(jie)收。
? READ,表(biao)示(shi)可以讀取(qu)客戶端連接(jie),你(ni)可以開始ji)寥qu)數據(ju)了(liao),讀取(qu)的過程不huan)嶙樅br />? END,表(biao)示(shi)請求結束,此時客戶端連接(jie)將被斷開。
? ERROR,表(biao)示(shi)發生了(liao)IO異(yi)常,一般(ban)將會結束此次請求並且連接(jie)會被斷開。

下(xia)面看一個簡單的例子(zi)︰

public class CometServlet extends HttpServlet implements CometProcessor { protected ArrayList connections = new ArrayList(); public void event(CometEvent event) throws IOException, ServletException { HttpServletRequest request = event.getHttpServletRequest(); HttpServletResponse response = event.getHttpServletResponse(); if (event.getEventType() == CometEvent.EventType.BEGIN) {  synchronized (connections) {  connections.add(response);  } } else if (event.getEventType() == CometEvent.EventType.ERROR) {  synchronized (connections) {  connections.remove(response);  } }else if (event.getEventType() == CometEvent.EventType.END) {  synchronized (connections) {  connections.remove(response);  } } else if (event.getEventType() == CometEvent.EventType.READ) {  InputStream is = request.getInputStream();  byte[] buf = new byte[512];  do {  int n = is.read(buf);  if (n > 0) {   System.out.println(new String(buf, 0, n));  } else if (n < 0) {   return;  }  } while (is.available() > 0); } }}

這個例子(zi)you)兄皇shi)簡單的客戶端連接(jie)都接(jie)收起來而不做任何處理,並將客戶端發送過來的數據(ju)輸出。很(hen)容易(yi)理解(jie),在BEGIN事件中接(jie)收連接(jie)並把響應對象假如到列(lie)表(biao)中,發送ERROR或END事件時則將響應對象移除,當READ事件時則讀取(qu)數據(ju)並輸出。

有了(liao)CometProcessor接(jie)口後,Tomcat內部(bu)就可以識別Comet模式的Servlet了(liao),我們(men)知(zhi)道(dao)Tomcat對請求的處理是(shi)管(guan)道(dao)模式的,所(suo)以在Wrapper容器(qi)的管(guan)道(dao)中判斷加載的Servlet是(shi)否繼承了(liao)CometProcessor,繼承則說明是(shi)Comet模式,則使用Comet方式處理。它的處理過程如圖,當一個客戶端連接(jie)到來,被接(jie)收器(qi)接(jie)收後注冊到NioChannel隊列(lie)中,Poller組件不斷xia)盅xun)是(shi)否有NioChannel需要處理,如果有則調用men)懊媸道(dao) omet模式Servlet,這里主要用到CometProcessor接(jie)口的event方法,Poller會將對應的請求對象、響應對象和(he)事件封裝成都CometEvent對象並傳入event方法。此時即執(zhi)行event方法的邏(luo)輯,完成對不同事件的處理,從(cong)而實現了(liao)Comet模式。
集成Comet

延you)煸畝粒/h3>

    Tag標簽(qian)︰Tomcat如何實現Comet  
    • 体彩天下官网

    • Directx11 游戲編程入門(men)教程
    • 專題主要學(xue)習DirectX的初(chu)級(ji)編程入門(men)學(xue)習,對Directx11的入門(men)及初(chu)學(xue)者有...... 詳細
    About IT165 - 廣告服務(wu) - 隱私聲(sheng)明 - 版(ban)權申明 - 免責(ze)條(tiao)款 - 網站(zhan)地(di)圖 - 網友投稿(gao) - 聯系方式
    本站(zhan)內容來自于互聯網,僅供(gong)用于網絡技(ji)術(shu)學(xue)習,學(xue)習中請遵循(xun)相關法律法規
    体彩天下官网 | 下一页