日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

comet4j开发指南

發(fā)布時(shí)間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 comet4j开发指南 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接:http://blog.csdn.net/majian_1987/article/details/8489738

?

準(zhǔn)備工作

下載服務(wù)端jar文件

Comet4J目前僅支持Tomcat6、7版本,根據(jù)您所使用的Tomcat版本下載【comet4jtomcat6.jar】或【comet4j-tomcat7.jar】文件放置到WEB項(xiàng)目的WEB-INF\lib目錄下。

?

下載客戶端js文件

下載【comet4j.js】到您的項(xiàng)目中,比如:WebContent\js目錄下。

修改服務(wù)器配置文件

因?yàn)镃omet4J工作在NIO方式下,所以我們需要調(diào)整服務(wù)器連接器配置,更換為NOI連接器。 打開server.xml文件將找到原先的連接器配置: [html]?view plaincopy
  • <Connector?executor="tomcatThreadPool"?port="8080"?protocol="HTTP/1.1"?connectionTimeout="20000"?redirectPort="8443"?/>??

  • 替換為: [html]?view plaincopy
  • <Connector?URIEncoding="UTF-8"?connectionTimeout="20000"?port="8080"?protocol="org.apache.coyote.http11.Http11NioProtocol"?redirectPort="8443"/>??

  • 客戶端

    我們利用Comet4J開發(fā)一個(gè)每隔一秒向所有客戶端推送服務(wù)器的剩余內(nèi)存大小。 helloworld.html [html]?view plaincopy
  • <!DOCTYPE?html?PUBLIC?"-//W3C//DTD?XHTML?1.0?Transitional//EN"?"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">??
  • <html?xmlns="http://www.w3.org/1999/xhtml">??
  • <head>??
  • <meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8"?/>??
  • <title>Comet4J?Hello?World</title>??
  • <script?type="text/javascript"?src="js/comet4j-0.0.2.js"></script>??
  • <script?type="text/javascript">??
  • function?init(){??
  • ????????var?kbDom?=?document.getElementById('kb');??
  • ????????JS.Engine.on({??
  • ????????????????hello?:?function(kb){//偵聽一個(gè)channel??
  • ????????????????????????kbDom.innerHTML?=?kb;??
  • ????????????????}??
  • ????????});??
  • ????????JS.Engine.start('conn');??
  • }??
  • </script>??
  • </head>??
  • <body?οnlοad="init()">??
  • ????????剩余內(nèi)存:<span?id="kb">...</span>KB??
  • </body>??
  • </html>??
  • ?

    服務(wù)端

    helloworld.java

    ?

    ?

    [java]?view plaincopy
  • package?org.comet4j.demo.helloworld;??
  • ??
  • import?javax.servlet.ServletContextEvent;??
  • import?javax.servlet.ServletContextListener;??
  • ??
  • import?org.comet4j.core.CometContext;??
  • import?org.comet4j.core.CometEngine;??
  • ??
  • public?class?HelloWorld?implements?ServletContextListener?{??
  • ????????private?static?final?String?CHANNEL?=?"hello";??
  • ????????public?void?contextInitialized(ServletContextEvent?arg0)?{??
  • ????????????????CometContext?cc?=?CometContext.getInstance();??
  • ????????????????cc.registChannel(CHANNEL);//注冊應(yīng)用的channel??
  • ????????????????Thread?helloAppModule?=?new?Thread(new?HelloAppModule(),?"Sender?App?Module");??
  • ????????????????helloAppModule.setDaemon(true);??
  • ????????????????helloAppModule.start();??
  • ??
  • ????????}??
  • ??
  • ????????class?HelloAppModule?implements?Runnable?{??
  • ????????????????public?void?run()?{??
  • ????????????????????????while?(true)?{??
  • ????????????????????????????????try?{??
  • ????????????????????????????????????????Thread.sleep(1000);??
  • ????????????????????????????????}?catch?(Exception?ex)?{??
  • ????????????????????????????????????????ex.printStackTrace();??
  • ????????????????????????????????}??
  • ????????????????????????????????CometEngine?engine?=?CometContext.getInstance().getEngine();??
  • ????????????????????????????????engine.sendToAll(CHANNEL,?Runtime.getRuntime().freeMemory()/1024);??
  • ????????????????????????}??
  • ????????????????}??
  • ????????}??
  • ??
  • ????????public?void?contextDestroyed(ServletContextEvent?arg0)?{??
  • ??
  • ????????}??
  • }??
  • ?

    ?

    配置

    web.xml [html]?view plaincopy
  • <listener>??
  • ????????????????<description>Comet4J容器偵聽</description>??
  • ????????????????<listener-class>org.comet4j.core.CometAppListener</listener-class>??
  • ????????</listener>??
  • ????????<servlet>??
  • ????????????????<description>Comet連接[默認(rèn):org.comet4j.core.CometServlet]</description>??
  • ????????????????<display-name>CometServlet</display-name>??
  • ????????????????<servlet-name>CometServlet</servlet-name>??
  • ????????????????<servlet-class>org.comet4j.core.CometServlet</servlet-class>??
  • ????????</servlet>??
  • ????????<servlet-mapping>??
  • ????????????????<servlet-name>CometServlet</servlet-name>??
  • ????????????????<url-pattern>/conn</url-pattern>??
  • ????????</servlet-mapping>??
  • ??
  • <listener>??
  • ??<description>HelloWorld</description>??
  • ??<listener-class>org.comet4j.demo.helloworld.HelloWorld</listener-class>??
  • </listener>??

  • 客戶端使用簡介

    客戶端是一個(gè)JavaScript文件(comet4j-0.0.2.js),其中最重要的是JS.Connector和JS.Engine兩個(gè)類。JS.Connector負(fù)責(zé)與服務(wù)器建立并保持連接,而JS.Engine類負(fù)責(zé)將服務(wù)器推送過來的消息轉(zhuǎn)化為開發(fā)人員可以處理的消息事件,并分發(fā)出去,大多數(shù)情況下,我們僅需要使用JS.Engine類就可以完成多數(shù)的開發(fā)工作。

    JS.Engine類是一個(gè)靜態(tài)類,在一個(gè)頁面中只有一個(gè)JS.Engine類的實(shí)例。它除了負(fù)責(zé)把服務(wù)器推過來的消息轉(zhuǎn)化為事件分發(fā)以外,與服務(wù)器的連接與斷開也由此類負(fù)責(zé)。

    JS.Engine.start方法

    JS.Engine.start(String str)和JS.Engine.stop(String str)分別控制連接和斷開動(dòng)作,start方法需要傳入一個(gè)字符串參數(shù),用來指定您配置的Comet4J連接地址。比如按前面準(zhǔn)備工作的配置了CometServlet的地址為/conn,那么可以這樣寫:

    [javascript]?view plaincopy
  • JS.Engine.start('/conn');??

  • 上段代碼我們讓瀏覽器與服務(wù)器進(jìn)行連接,當(dāng)連接成功以后JS.Engine類會發(fā)出"start"事件,如何進(jìn)行事件的處理我們稍后介紹。

    JS.Engine.stop方法

    我們也能夠讓連接斷開:
    [javascript]?view plaincopy
  • JS.Engine.stop('主動(dòng)斷開');??
  • ?

    上面代碼我們讓連接斷開,并傳入了一個(gè)“主動(dòng)斷開”這樣一個(gè)斷開的原因。如果您并不需要對斷開的原因進(jìn)行說明,也可以不傳遞參數(shù):

    [javascript]?view plaincopy
  • JS.Engine.stop();??
  • ?

    ?

    ?

    JS.Engine類的事件處理

    上面我們介紹了如何使用start和stop方法來建立和斷開連接,當(dāng)成功建立連接已后JS.Engine會發(fā)出"start"事件,當(dāng)斷開后會發(fā)出“stop”事件,當(dāng)收到某個(gè)通道推送過來的信息時(shí)也會發(fā)出與通道標(biāo)識同名的事件。您可以事先在中使用JS.Engine.on方法來注冊事件處理函數(shù)。例如:

    ?

    [javascript]?view plaincopy
  • JS.Engine.on('start',function(cId,?channelList,?engine){??
  • ????alert('連接已建立,連接ID為:'?+?cId);??
  • });??
  • JS.Engine.on('stop',function(cause,?cId,?url,?engine){??
  • ????alert('連接已斷開,連接ID為:'?+?cId?+?',斷開原因:'?+?cause?+?',斷開的連接地址:'+?url);??
  • });??

  • 也可以將上段代碼寫成,下面代碼與上段代碼完全等效:

    ?

    [javascript]?view plaincopy
  • JS.Engine.on({??
  • ????start?:?function(cId,?channelList,?engine){??
  • ??????alert('連接已建立,連接ID為:'?+?cId);??
  • ????},??
  • ????stop?:?function(cause,?cId,?url,?engine){??
  • ??????alert('連接已斷開,連接ID為:'?+?cId?+?',斷開原因:'?+?cause?+?',斷開的連接地址:'+?url);??
  • ????}??
  • });??


  • ?


    接下來,介紹一下如何對服務(wù)器推送過來的消息進(jìn)行處理。在介紹之前,我們假設(shè)后臺已經(jīng)注冊了一個(gè)"hello"的應(yīng)用通道標(biāo)識,并且只向客戶端推送簡單的字符串信息。先看如下代碼: [javascript]?view plaincopy
  • JS.Engine.on('hello',function(text){??
  • ????alert(text);??
  • });??

  • 這樣當(dāng)服務(wù)器端使用"hello"通道標(biāo)識推送過來的消息就可以由上段代碼進(jìn)行處理,將推送過來的信息彈出。 特別注意:以上代碼在事件處理函數(shù)中使用了alert僅為說明函數(shù)功能,實(shí)際使用中,在事件處理函數(shù)中切勿使用alert、prompt、confirm等可以中斷腳本運(yùn)行的函數(shù),因?yàn)镋ngine需要實(shí)時(shí)的保持工作狀態(tài)。

    服務(wù)器端使用簡介

    服務(wù)端由一個(gè)Jar包組成,其中最重的是CometContext和CometEngine兩個(gè)類。

    Comet Context 類

    CometContext是一個(gè)單態(tài)類,通過其getInstance方法來獲得實(shí)例,它主要負(fù)責(zé)框架的一些初始化工作保存著一些參數(shù)的配置值,除此之外它還有一個(gè)更重要的職責(zé)——負(fù)責(zé)注冊應(yīng)用通道標(biāo)識。如果您想使用框架來實(shí)現(xiàn)自己的應(yīng)用,那么您必需要為自己的應(yīng)用分配一個(gè)唯一的通道標(biāo)識,并將此通道標(biāo)識在WEB容器啟動(dòng)時(shí)使用CometContext的registChannel方法進(jìn)行注冊,這樣,客戶端才可以正確接受此應(yīng)用所推送的消息。注冊一個(gè)通道標(biāo)識非常簡單 [java]?view plaincopy
  • CometContext.getInstance().registChannel("hello");??

  • 這樣便注冊了一個(gè)標(biāo)識為“hello”的應(yīng)用通道,而客戶也可以通過JS.Engine.on('hello',function(msg){...})的形式來接收并處理來自此通道的消息。

    Comet Engine 類

    另一個(gè)重要的類是CometEngine,它除了負(fù)責(zé)對連接的處理之外,對于開發(fā)人員而言,更加常用的可能是它所提供的sendTo或sendToAll方法來向客戶端發(fā)送消息: [java]?view plaincopy
  • ring?channel?=?"hello";??
  • String?someConnectionId?=?"1125-6634-888";??
  • engine.sendToAll(channel?,?"我來了!");??
  • engine.sendTo(channel?,?engine.getConnection(someConnectionId),“Hi,我是XXX”);??

  • 上面代碼使用sendToAll方法向所有客戶端在"hello"通道上發(fā)送了“我來了!”這樣一條消息,然后又使用sendTo在同樣的通道上向某一個(gè)連接發(fā)送了“Hi,我是XXX”消息。 CometEngine另外一個(gè)很重要的地方在于,它是框架工作的事件引擎的集散地,它提供了BeforeConnectEvent、BeforeDropEvent、ConnectEvent、DropEvent、MessageEvent等事件。通過對這些事件的處理來實(shí)現(xiàn)具體的功能: [java]?view plaincopy
  • class?JoinListener?extends?ConnectListener?{??
  • ????????@Override??
  • ????????public?boolean?handleEvent(ConnectEvent?anEvent)?{??
  • ????????????????CometConnection?conn?=?anEvent.getConn();??
  • ????????????????CometContext.getInstance().getEngine().sendTo("hello",?conn.getId(),"歡迎上線");??
  • ????????}??
  • }??
  • ??
  • CometEngine?engine?=?CometContext.getInstance().getEngine();??
  • engine.addConnectListener(new?JoinListener()??

  • 上面先定義了一個(gè)JoinListener并實(shí)現(xiàn)了父類ConnectListener的handleEvent抽像方法,然后使用engine.addConnectListener來注冊這個(gè)事件偵聽。這樣,在有客戶與服務(wù)器成功建立連接已后,就可以向此客戶端推送一條歡迎信息。

    Comet4J配置參數(shù)表

    [html]?view plaincopy
  • <!--Comet4J配置?-->??
  • <listener>??
  • ????????<description>Comet4J容器偵聽</description>??
  • ????????<listener-class>org.comet4j.core.CometAppListener</listener-class>??
  • </listener>??
  • <servlet>??
  • ????????<description>Comet連接[默認(rèn):org.comet4j.core.CometServlet]</description>??
  • ????????<display-name>CometServlet</display-name>??
  • ????????<servlet-name>CometServlet</servlet-name>??
  • ????????<servlet-class>org.comet4j.core.CometServlet</servlet-class>??
  • </servlet>??
  • <servlet-mapping>??
  • ????????<servlet-name>CometServlet</servlet-name>??
  • ????????<url-pattern>/conn</url-pattern>??
  • </servlet-mapping>??
  • <!--?Comet4J可選參數(shù)配置-->??
  • <context-param>??
  • ????????<description>語言[支持:zh,en,默認(rèn):zh,詳細(xì)http://www.loc.gov/standards/iso639-2/php/English_list.php]</description>??
  • ????????<param-name>Comet.Language</param-name>??
  • ????????<param-value>zh</param-value>??
  • </context-param>??
  • <context-param>??
  • ????????<description>請求超時(shí)時(shí)間/微妙[默認(rèn):60000,1分鐘,建議至少設(shè)置3秒以上]</description>??
  • ????????<param-name>Comet.Timeout</param-name>??
  • ????????<param-value>60000</param-value>??
  • </context-param>??
  • <context-param>??
  • ????????<description>連接空閑過期時(shí)間/微妙[默認(rèn):5000,5秒]</description>??
  • ????????<param-name>Comet.ConnExpires</param-name>??
  • ????????<param-value>5000</param-value>??
  • </context-param>??
  • <context-param>??
  • ????????<description>連接檢查頻率/微妙[默認(rèn):5000,5秒]</description>??
  • ????????<param-name>Comet.ConnFrequency</param-name>??
  • ????????<param-value>5000</param-value>??
  • </context-param>??
  • <context-param>??
  • ????????<description>緩存信息過期時(shí)間/微妙[默認(rèn):60000,1分種]</description>??
  • ????????<param-name>Comet.CacheExpires</param-name>??
  • ????????<param-value>60000</param-value>??
  • </context-param>??
  • <context-param>??
  • ????????<description>緩存信息過期檢查頻率/微妙[默認(rèn):60000,1分種]</description>??
  • ????????<param-name>Comet.CacheFrequency</param-name>??
  • ????????<param-value>60000</param-value>??
  • </context-param>??
  • <context-param>??
  • ????????<description>連接模式[auto(默認(rèn))/stream/lpool]</description>??
  • ????????<param-name>Comet.WorkStyle</param-name>??
  • ????????<param-value>auto</param-value>??
  • </context-param>??
  • <context-param>??
  • ????????<description>開啟調(diào)試[false(默認(rèn))/true]</description>??
  • ????????<param-name>Comet.Debug</param-name>??
  • ????????<param-value>false</param-value>??
  • </context-param>??
  • ?

    轉(zhuǎn)載于:https://www.cnblogs.com/zhongshiqiang/p/6679887.html

    總結(jié)

    以上是生活随笔為你收集整理的comet4j开发指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。