Comet4j

来源:互联网 发布:有道云mac 隐藏侧边栏 编辑:程序博客网 时间:2024/05/21 22:36

Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。

下面网址可以下载:

http://code.google.com/p/comet4j/

 

 

准备工作
一.下载服务端jar文件
    Comet4J目前仅支持Tomcat6、7版本,根据您所使用的Tomcat版本下载 comet4j-tomcat6.jar 或 comet4j-tomcat7.jar 。
二.下载客户端js文件
下载 comet4j.js 到您的项目中。
三.修改服务器配置文件
    因为Comet4J工作在NIO方式下,所以我们需要调整服务器连接器配置,更换为NOI连接器。

    打开server.xml文件将找到原先的连接器配置:
    

Xml代码  收藏代码
  1. <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />  

 
    替换为:
   

Xml代码  收藏代码
  1. <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080"  protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>  

 

*注意:NIO方式与BIO(Socket)的方式的最大区别就是NIO是一请求一线程,而BIO是一连接一线程,后者就导致如果服务器未来得及响应客户端就要一直等一直等,该连接就一直占用着这个线程。如果是NIO的话则可以复用连接,也就是无须等待服务器端的响应就可以继续给服务器端发送消息,发送和接收是异步响应的。

 

在web.xml中加载Comet4J框架

最后我们需要在web.xml配置侦听和comet连接地址,以使Comet4J生效:

Xml代码  收藏代码
  1. <listener>  
  2.     <description>Comet4J容器侦听</description>  
  3.     <listener-class>org.comet4j.core.CometAppListener</listener-class>  
  4.   </listener>  
  5.   <servlet>  
  6.     <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  
  7.     <display-name>CometServlet</display-name>  
  8.     <servlet-name>CometServlet</servlet-name>  
  9.     <servlet-class>org.comet4j.core.CometServlet</servlet-class>  
  10.   </servlet>  
  11.   <servlet-mapping>  
  12.     <servlet-name>CometServlet</servlet-name>  
  13.     <url-pattern>/conn</url-pattern>  
  14.   </servlet-mapping>  

 这里是最小化配置。

 

HelloWorld:

 

我们利用Comet4J开发一个每隔一秒向所有客户端推送服务器的剩余内存大小。 helloworld.html

 

Html代码  收藏代码
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <htmlxmlnshtmlxmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <metahttp-equivmetahttp-equiv="Content-Type"content="text/html; charset=utf-8"/>  
  5. <title>Comet4J Hello World</title>  
  6. <scripttypescripttype="text/javascript"src="js/comet4j-0.0.2.js"></script>  
  7. <scripttypescripttype="text/javascript">  
  8. function init(){  
  9.         var kbDom = document.getElementById('kb');  
  10.         JS.Engine.on({  
  11.                 hello :function(kb){//侦听一个channel  
  12.                       kbkbDom.innerHTML = kb;  
  13.                 }  
  14.         });  
  15.         JS.Engine.start('conn');  
  16. }  
  17. </script>  
  18. </head>  
  19. <body onload="init()">  
  20.         剩余内存:<span id="kb">...</span>KB  
  21. </body>  
  22. </html>  

 

服务端

 helloworld.java

 

Java代码  收藏代码
  1. package org.comet4j.demo.helloworld;  
  2.  import javax.servlet.ServletContextEvent;  
  3.  import javax.servlet.ServletContextListener;  
  4.   
  5.  import org.comet4j.core.CometContext;  
  6.  import org.comet4j.core.CometEngine;  
  7.   
  8.  public class HelloWorld implements ServletContextListener{  
  9.         private static final String CHANNEL ="hello";  
  10.         public void contextInitialized(ServletContextEvent arg0){  
  11.                 CometContext cc =CometContext.getInstance();  
  12.                 cc.registChannel(CHANNEL);//注册应用的channel  
  13.                 Thread helloAppModule =newThread(newHelloAppModule(),"Sender App Module");  
  14.                 helloAppModule.setDaemon(true);  
  15.                 helloAppModule.start();  
  16.   
  17.         }  
  18.   
  19.         class HelloAppModule implements Runnable{  
  20.                 public void run(){  
  21.                         while(true){  
  22.                                 try{  
  23.                                         Thread.sleep(1000);  
  24.                                 }catch(Exception ex){  
  25.                                         ex.printStackTrace();  
  26.                                 }  
  27.                                 CometEngine engine =CometContext.getInstance().getEngine();  
  28.                                 engine.sendToAll(CHANNEL,Runtime.getRuntime().freeMemory()/1024);  
  29.                         }  
  30.                 }  
  31.         }  
  32.   
  33.         public void contextDestroyed(ServletContextEvent arg0){  
  34.   
  35.         }  
  36.  }  

 

配置

web.xml

 

Xml代码  收藏代码
  1. <listener>  
  2.                 <description>Comet4J容器侦听</description>  
  3.                 <listener-class>org.comet4j.core.CometAppListener</listener-class>  
  4.         </listener>  
  5.         <servlet>  
  6.                 <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  
  7.                 <display-name>CometServlet</display-name>  
  8.                 <servlet-name>CometServlet</servlet-name>  
  9.                 <servlet-class>org.comet4j.core.CometServlet</servlet-class>  
  10.         </servlet>  
  11.         <servlet-mapping>  
  12.                 <servlet-name>CometServlet</servlet-name>  
  13.                 <url-pattern>/conn</url-pattern>  
  14.         </servlet-mapping>  
  15.   
  16. <listener>  
  17.   <description>HelloWorld</description>  
  18.   <listener-class>org.comet4j.demo.helloworld.HelloWorld</listener-class>  
  19.  </listener>  
0 0
原创粉丝点击