Comet4J(Comet for Java)是一個純粹基于AJAX(XMLHTTPRequest)的服務器推送框架,消息以JSON方式傳遞,具備長輪詢、長連接、自動選擇三種工作模式。
在線Demo體驗
http://www.comet4j.org:8080/comet4j/
功能特性
- 推送消息廣播。
- 推送定向消息。
- 提供連接上線前、上線、下線前、下線、發送消息等多種可處理事件。
- 消息緩存機制,確保長輪詢工作模式下不丟失消息。
- 客戶端正常下線,服務端可立即感知。
- 客戶端異常停止工作,服務端可定時檢查并感知。
- 以注冊通道應用的方式,讓開發者對框架功能進行擴展,實現自己的應用。
框架特性
- 獨立小巧,不依賴于第三方包。
- 與應用緊密集成,無需獨立應用或服務器。
- 與Session無關的連接機制,為開發人員提供最大程度的功能可控性。
- 面向事件編程,客戶端與服務器端均為事件驅動開發模式,提供了良好的可擴展性機制。
- 各項性能參數均可配置。
- 支持多種主流瀏覽器,并支持Air應用環境。
服務器支持情況
Tomcat6、Tomcat7
瀏覽器支持情況
支持XMLHTTPRequest對象的瀏覽器均可支持長輪詢工作模式,但不一定能夠支持長連接。
| 瀏覽器/平臺 | 版本 | 長輪詢 | 長連接 | 
| Internet Explorer | 6,7,8,9 | √ | X | 
| FireFox | 3.0+(更底版本未知) | √ | √ | 
| Chrome | 7.0+(更底版本未知) | √ | √ | 
| Safari | 5+(更底版本未知) | √ | √ | 
| Opera | 11.10+(更底版本未知) | √ | X | 
| Air | 1.5+(更底版本未知) | √ | √ | 
| IOS(Iphone/Ipad) | 3.1+(更底版本未知) | √ | √ | 
| Android | 未測試 | 未知 | 未知 | 
| BlackBerry | 未測試 | 未知 | 未知 | 
?
?
      準備工作
      
      1.下載服務端jar文件
      
      2.下載客戶端js文件
      
      3.修改服務器配置文件
      
      客戶端
      
      服務端
      
      配置
      
      準備工作
      
      1.下載服務端jar文件
      
      Comet4J目前僅支持Tomcat6、7版本,根據您所使用的Tomcat版本下載【comet4j-tomcat6.jar】或【comet4j-tomcat7.jar】文件放置到WEB項目的WEB-INF\lib目錄下。
      
      2.下載客戶端js文件
      
      下載【comet4j.js】到您的項目中,比如:WebContent\js目錄下。
      
      3.修改服務器配置文件
      
      因為Comet4J工作在NIO方式下,所以我們需要調整服務器連接器配置,更換為NOI連接器。 打開server.xml文件將找到原先的連接器配置:
      
      ? <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
      
      替換為:
      
      ? <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
      
      客戶端
      
      我們利用Comet4J開發一個每隔一秒向所有客戶端推送服務器的剩余內存大小。 helloworld.html
    
      <!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){//偵聽一個channel
      
      ??????????????????????? kbDom.innerHTML = kb;
      
      ??????????????? }
      
      ??????? });
      
      ??????? JS.Engine.start('conn');
      
      }
      
      </script>
      
      </head>
      
      <body onload="init()">
      
      ??????? 剩余內存:<span id="kb">...</span>KB
      
      </body>
      
      </html>
      
      服務端
      
      helloworld.java
    
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);//注冊應用的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
    
      <listener>
      
      ??????????????? <description>Comet4J容器偵聽</description>
      
      ??????????????? <listener-class>org.comet4j.core.CometAppListener</listener-class>
      
      ??????? </listener>
      
      ??????? <servlet>
      
      ??????????????? <description>Comet連接[默認: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>
    
轉載自:
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
 
					微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
 
					

 
      