欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Tomcat如何實(shí)現(xiàn)Comet

 更新時(shí)間:2016年12月16日 10:26:31   作者:seaboat 汪洋之舟  
Comet模式是一種服務(wù)器端推技術(shù),它的核心思想提供一種能讓當(dāng)服務(wù)器端往客戶(hù)端發(fā)送數(shù)據(jù)的方式。本篇文章主要介紹了Tomcat如何實(shí)現(xiàn)Comet,有興趣的可以了解一下。

Comet模式是一種服務(wù)器端推技術(shù),它的核心思想提供一種能讓當(dāng)服務(wù)器端往客戶(hù)端發(fā)送數(shù)據(jù)的方式。Comet模式為什么會(huì)出現(xiàn)?剛開(kāi)始人們?cè)诳蛻?hù)端通過(guò)不斷自動(dòng)刷新整個(gè)頁(yè)面來(lái)更新數(shù)據(jù),后來(lái)覺(jué)得體驗(yàn)不好又使用了AJAX不斷從客戶(hù)端輪詢(xún)服務(wù)器更新數(shù)據(jù),然后是使用Comet模式由服務(wù)器端通過(guò)長(zhǎng)連接推數(shù)據(jù)。Comet模式能大大減少發(fā)送到服務(wù)器端的請(qǐng)求從而避免了很多開(kāi)銷(xiāo),而且它還具備更好的實(shí)時(shí)性。

如圖所示,客戶(hù)端發(fā)送一個(gè)請(qǐng)求到服務(wù)器,服務(wù)器接收了連接后一直保持住連接不關(guān)閉;接著客戶(hù)端發(fā)送一個(gè)操作報(bào)文告訴服務(wù)器需要做什么操作,服務(wù)器處理完事件1后會(huì)給客戶(hù)端響應(yīng),然后處理完事件2后又會(huì)給客戶(hù)端響應(yīng);然后客戶(hù)端繼續(xù)發(fā)送操作報(bào)文給服務(wù)器,服務(wù)器再進(jìn)行響應(yīng)。

一般Comet模式需要NIO配合,而在BIO中無(wú)法使用Comet模式。在Tomcat內(nèi)部集成Comet模式的思路也比較清晰,引入了一個(gè)CometProcessor接口,此接口只有一個(gè)event方法,具體接口代碼如下:

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

而CometEvent則表示Comet相關(guān)的事件,它包含四BEGIN, READ, END, ERROR四個(gè)事件,分別表示:

① BEGIN,表示請(qǐng)求開(kāi)始,此時(shí)客戶(hù)端連接已被接收。

② READ,表示可以讀取客戶(hù)端連接,你可以開(kāi)始讀取數(shù)據(jù)了,讀取的過(guò)程不會(huì)阻塞。

③ END,表示請(qǐng)求結(jié)束,此時(shí)客戶(hù)端連接將被斷開(kāi)。

④ ERROR,表示發(fā)生了IO異常,一般將會(huì)結(jié)束此次請(qǐng)求并且連接會(huì)被斷開(kāi)。

下面看一個(gè)簡(jiǎn)單的例子:

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);
    }
  }
}

這個(gè)例子中只是簡(jiǎn)單的客戶(hù)端連接都接收起來(lái)而不做任何處理,并將客戶(hù)端發(fā)送過(guò)來(lái)的數(shù)據(jù)輸出。很容易理解,在BEGIN事件中接收連接并把響應(yīng)對(duì)象假如到列表中,發(fā)送ERROR或END事件時(shí)則將響應(yīng)對(duì)象移除,當(dāng)READ事件時(shí)則讀取數(shù)據(jù)并輸出。

有了CometProcessor接口后,Tomcat內(nèi)部就可以識(shí)別Comet模式的Servlet了,我們知道Tomcat對(duì)請(qǐng)求的處理是管道模式的,所以在Wrapper容器的管道中判斷加載的Servlet是否繼承了CometProcessor,繼承則說(shuō)明是Comet模式,則使用Comet方式處理。它的處理過(guò)程如圖,當(dāng)一個(gè)客戶(hù)端連接到來(lái),被接收器接收后注冊(cè)到NioChannel隊(duì)列中,Poller組件不斷輪詢(xún)是否有NioChannel需要處理,如果有則調(diào)用前面實(shí)例化的Comet模式Servlet,這里主要用到CometProcessor接口的event方法,Poller會(huì)將對(duì)應(yīng)的請(qǐng)求對(duì)象、響應(yīng)對(duì)象和事件封裝成都CometEvent對(duì)象并傳入event方法。此時(shí)即執(zhí)行event方法的邏輯,完成對(duì)不同事件的處理,從而實(shí)現(xiàn)了Comet模式。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 詳解Windows下調(diào)整Tomcat啟動(dòng)參數(shù)的實(shí)現(xiàn)方法

    詳解Windows下調(diào)整Tomcat啟動(dòng)參數(shù)的實(shí)現(xiàn)方法

    這篇文章主要介紹了詳解Windows下調(diào)整Tomcat啟動(dòng)參數(shù)的實(shí)現(xiàn)方法的相關(guān)資料,希望通過(guò)本文大家能夠修改Tomcat啟動(dòng)參數(shù)來(lái)實(shí)現(xiàn)自己想要的效果,需要的朋友可以參考下
    2017-09-09
  • Tomcat 熱部署的實(shí)現(xiàn)原理詳解

    Tomcat 熱部署的實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了Tomcat 熱部署的實(shí)現(xiàn)原理詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • Tomcat內(nèi)存泄漏檢測(cè)和預(yù)防策略

    Tomcat內(nèi)存泄漏檢測(cè)和預(yù)防策略

    內(nèi)存泄漏是Java應(yīng)用程序中常見(jiàn)的問(wèn)題,尤其是在使用如Tomcat這樣的應(yīng)用服務(wù)器時(shí),檢測(cè)和預(yù)防內(nèi)存泄漏需要結(jié)合代碼審查、工具監(jiān)控和良好的編程習(xí)慣,以下是一些詳細(xì)的步驟和示例代碼,需要的朋友可以參考下
    2024-11-11
  • 解析Tomcat的啟動(dòng)腳本--catalina.bat

    解析Tomcat的啟動(dòng)腳本--catalina.bat

    本文主要對(duì)Tomcat的三個(gè)最重要的啟動(dòng)腳本之一--catalina.bat腳本做了詳細(xì)分析,具有很好的參考價(jià)值,需要的朋友可以看下
    2016-12-12
  • 淺析Tomcat各種日志的關(guān)系與catalina.out文件的分割問(wèn)題

    淺析Tomcat各種日志的關(guān)系與catalina.out文件的分割問(wèn)題

    這篇文章主要介紹了Tomcat各種日志的關(guān)系與catalina.out文件的分割,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-10-10
  • 學(xué)習(xí)javaweb如何配置Tomcat的熱啟動(dòng)

    學(xué)習(xí)javaweb如何配置Tomcat的熱啟動(dòng)

    學(xué)習(xí)javaweb的時(shí)候每次更改項(xiàng)目都需要重新部署項(xiàng)目,如此一來(lái)比較麻煩,使用tomcat的熱啟動(dòng)就可以解決這個(gè)問(wèn)題
    2014-09-09
  • 詳解用Tomcat服務(wù)器配置https雙向認(rèn)證過(guò)程實(shí)戰(zhàn)

    詳解用Tomcat服務(wù)器配置https雙向認(rèn)證過(guò)程實(shí)戰(zhàn)

    本篇文章主要介紹了詳解用Tomcat服務(wù)器配置https雙向認(rèn)證過(guò)程實(shí)戰(zhàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Tomcat體系結(jié)構(gòu)與插件配置教程圖解

    Tomcat體系結(jié)構(gòu)與插件配置教程圖解

    這篇文章主要介紹了Tomcat體系結(jié)構(gòu)與插件配置教程圖解,包括發(fā)布程序的過(guò)程和tomcat服務(wù)器體系結(jié)構(gòu),需要的朋友可以參考下
    2018-05-05
  • 搭建Tomcat 8源碼開(kāi)發(fā)環(huán)境的步驟詳解

    搭建Tomcat 8源碼開(kāi)發(fā)環(huán)境的步驟詳解

    相信大家都知道開(kāi)源軟件tomcat目前幾乎已經(jīng)是Java web開(kāi)發(fā)的必備軟件了,目前有很多關(guān)于tomcat的書(shū)籍,已經(jīng)通過(guò)配置對(duì)tomcat進(jìn)行一些跟應(yīng)用業(yè)務(wù)功能的調(diào)優(yōu),但感覺(jué)如果僅僅只是了解一些配置,可能稍微少了點(diǎn)什么,下面通過(guò)本文深入到源代碼中進(jìn)行學(xué)些和了解。
    2016-10-10
  • 關(guān)于Tomcat?結(jié)合Atomikos?實(shí)現(xiàn)JTA的方法

    關(guān)于Tomcat?結(jié)合Atomikos?實(shí)現(xiàn)JTA的方法

    Tomcat作為一款經(jīng)典的Web服務(wù)器,在開(kāi)發(fā)、測(cè)試和生產(chǎn)環(huán)境中得到了廣泛的使用。但Tomcat畢竟不是Java EE服務(wù)器,因此在EJB,JTA方面并沒(méi)有提供支持。本文講述了Tomcat使用Atomikos實(shí)現(xiàn)JTA的一種方法,需要的朋友可以參考下
    2021-11-11

最新評(píng)論