`

java web 推送之comet4j

 
阅读更多

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

 

 

准备工作

下载服务端jar文件

Comet4J目前仅支持Tomcat6、7版本,根据您所使用的Tomcat版本下载【comet4jtomcat6.jar】或【comet4j-tomcat7.jar】文件放置到WEB项目的WEB-INF\lib目录下。

 

下载客户端js文件

下载【comet4j.js】到您的项目中,比如:WebContent\js目录下。
 
 

修改服务器配置文件

因为Comet4J工作在NIO方式下,所以我们需要调整服务器连接器配置,更换为NOI连接器。 打开server.xml文件将找到原先的连接器配置:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />  

替换为:
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>  

客户端

我们利用Comet4J开发一个每隔一秒向所有客户端推送服务器的剩余内存大小。 helloworld.html
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
  2. <html xmlns="http://www.w3.org/1999/xhtml">  
  3. <head>  
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
  5. <title>Comet4J Hello World</title>  
  6. <script type="text/javascript" src="js/comet4j-0.0.2.js"></script>  
  7. <script type="text/javascript">  
  8. function init(){  
  9.         var kbDom = document.getElementById('kb');  
  10.         JS.Engine.on({  
  11.                 hello : function(kb){//侦听一个channel  
  12.                         kbDom.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] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. package org.comet4j.demo.helloworld;  
  2.   
  3. import javax.servlet.ServletContextEvent;  
  4. import javax.servlet.ServletContextListener;  
  5.   
  6. import org.comet4j.core.CometContext;  
  7. import org.comet4j.core.CometEngine;  
  8.   
  9. public class HelloWorld implements ServletContextListener {  
  10.         private static final String CHANNEL = "hello";  
  11.         public void contextInitialized(ServletContextEvent arg0) {  
  12.                 CometContext cc = CometContext.getInstance();  
  13.                 cc.registChannel(CHANNEL);//注册应用的channel  
  14.                 Thread helloAppModule = new Thread(new HelloAppModule(), "Sender App Module");  
  15.                 helloAppModule.setDaemon(true);  
  16.                 helloAppModule.start();  
  17.   
  18.         }  
  19.   
  20.         class HelloAppModule implements Runnable {  
  21.                 public void run() {  
  22.                         while (true) {  
  23.                                 try {  
  24.                                         Thread.sleep(1000);  
  25.                                 } catch (Exception ex) {  
  26.                                         ex.printStackTrace();  
  27.                                 }  
  28.                                 CometEngine engine = CometContext.getInstance().getEngine();  
  29.                                 engine.sendToAll(CHANNEL, Runtime.getRuntime().freeMemory()/1024);  
  30.                         }  
  31.                 }  
  32.         }  
  33.   
  34.         public void contextDestroyed(ServletContextEvent arg0) {  
  35.   
  36.         }  
  37. }  

 

配置

web.xml
[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  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>  

 

客户端使用简介

客户端是一个JavaScript文件(comet4j-0.0.2.js),其中最重要的是JS.Connector和JS.Engine两个类。JS.Connector负责与服务器建立并保持连接,而JS.Engine类负责将服务器推送过来的消息转化为开发人员可以处理的消息事件,并分发出去,大多数情况下,我们仅需要使用JS.Engine类就可以完成多数的开发工作。

JS.Engine类是一个静态类,在一个页面中只有一个JS.Engine类的实例。它除了负责把服务器推过来的消息转化为事件分发以外,与服务器的连接与断开也由此类负责。

JS.Engine.start方法

JS.Engine.start(String str)和JS.Engine.stop(String str)分别控制连接和断开动作,start方法需要传入一个字符串参数,用来指定您配置的Comet4J连接地址。比如按前面准备工作的配置了CometServlet的地址为/conn,那么可以这样写:

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. JS.Engine.start('/conn');  

上段代码我们让浏览器与服务器进行连接,当连接成功以后JS.Engine类会发出"start"事件,如何进行事件的处理我们稍后介绍。

JS.Engine.stop方法

我们也能够让连接断开:
[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. JS.Engine.stop('主动断开');  

上面代码我们让连接断开,并传入了一个“主动断开”这样一个断开的原因。如果您并不需要对断开的原因进行说明,也可以不传递参数:

[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. JS.Engine.stop();  

JS.Engine类的事件处理

上面我们介绍了如何使用start和stop方法来建立和断开连接,当成功建立连接已后JS.Engine会发出"start"事件,当断开后会发出“stop”事件,当收到某个通道推送过来的信息时也会发出与通道标识同名的事件。您可以事先在中使用JS.Engine.on方法来注册事件处理函数。例如:
[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. JS.Engine.on('start',function(cId, channelList, engine){  
  2.     alert('连接已建立,连接ID为:' + cId);  
  3. });  
  4. JS.Engine.on('stop',function(cause, cId, url, engine){  
  5.     alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);  
  6. });  

也可以将上段代码写成,下面代码与上段代码完全等效:
[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. JS.Engine.on({  
  2.     start : function(cId, channelList, engine){  
  3.       alert('连接已建立,连接ID为:' + cId);  
  4.     },  
  5.     stop : function(cause, cId, url, engine){  
  6.       alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);  
  7.     }  
  8. });  



接下来,介绍一下如何对服务器推送过来的消息进行处理。在介绍之前,我们假设后台已经注册了一个"hello"的应用通道标识,并且只向客户端推送简单的字符串信息。先看如下代码:
[javascript] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. JS.Engine.on('hello',function(text){  
  2.     alert(text);  
  3. });  

这样当服务器端使用"hello"通道标识推送过来的消息就可以由上段代码进行处理,将推送过来的信息弹出。
特别注意:以上代码在事件处理函数中使用了alert仅为说明函数功能,实际使用中,在事件处理函数中切勿使用alert、prompt、confirm等可以中断脚本运行的函数,因为Engine需要实时的保持工作状态。
 

服务器端使用简介

服务端由一个Jar包组成,其中最重的是CometContext和CometEngine两个类。

Comet Context 类

CometContext是一个单态类,通过其getInstance方法来获得实例,它主要负责框架的一些初始化工作保存着一些参数的配置值,除此之外它还有一个更重要的职责——负责注册应用通道标识。如果您想使用框架来实现自己的应用,那么您必需要为自己的应用分配一个唯一的通道标识,并将此通道标识在WEB容器启动时使用CometContext的registChannel方法进行注册,这样,客户端才可以正确接受此应用所推送的消息。注册一个通道标识非常简单
[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. CometContext.getInstance().registChannel("hello");  

这样便注册了一个标识为“hello”的应用通道,而客户也可以通过JS.Engine.on('hello',function(msg){...})的形式来接收并处理来自此通道的消息。

Comet Engine 类

另一个重要的类是CometEngine,它除了负责对连接的处理之外,对于开发人员而言,更加常用的可能是它所提供的sendTo或sendToAll方法来向客户端发送消息:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. ring channel = "hello";  
  2. String someConnectionId = "1125-6634-888";  
  3. engine.sendToAll(channel , "我来了!");  
  4. engine.sendTo(channel , engine.getConnection(someConnectionId),“Hi,我是XXX”);  

上面代码使用sendToAll方法向所有客户端在"hello"通道上发送了“我来了!”这样一条消息,然后又使用sendTo在同样的通道上向某一个连接发送了“Hi,我是XXX”消息。 CometEngine另外一个很重要的地方在于,它是框架工作的事件引擎的集散地,它提供了BeforeConnectEvent、BeforeDropEvent、ConnectEvent、DropEvent、MessageEvent等事件。通过对这些事件的处理来实现具体的功能:
[java] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. class JoinListener extends ConnectListener {  
  2.         @Override  
  3.         public boolean handleEvent(ConnectEvent anEvent) {  
  4.                 CometConnection conn = anEvent.getConn();  
  5.                 CometContext.getInstance().getEngine().sendTo("hello", conn.getId(),"欢迎上线");  
  6.         }  
  7. }  
  8.   
  9. CometEngine engine = CometContext.getInstance().getEngine();  
  10. engine.addConnectListener(new JoinListener()  

上面先定义了一个JoinListener并实现了父类ConnectListener的handleEvent抽像方法,然后使用engine.addConnectListener来注册这个事件侦听。这样,在有客户与服务器成功建立连接已后,就可以向此客户端推送一条欢迎信息。

Comet4J配置参数表

 

[html] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. <!--Comet4J配置 -->  
  2. <listener>  
  3.         <description>Comet4J容器侦听</description>  
  4.         <listener-class>org.comet4j.core.CometAppListener</listener-class>  
  5. </listener>  
  6. <servlet>  
  7.         <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  
  8.         <display-name>CometServlet</display-name>  
  9.         <servlet-name>CometServlet</servlet-name>  
  10.         <servlet-class>org.comet4j.core.CometServlet</servlet-class>  
  11. </servlet>  
  12. <servlet-mapping>  
  13.         <servlet-name>CometServlet</servlet-name>  
  14.         <url-pattern>/conn</url-pattern>  
  15. </servlet-mapping>  
  16. <!-- Comet4J可选参数配置-->  
  17. <context-param>  
  18.         <description>语言[支持:zh,en,默认:zh,详细http://www.loc.gov/standards/iso639-2/php/English_list.php]</description>  
  19.         <param-name>Comet.Language</param-name>  
  20.         <param-value>zh</param-value>  
  21. </context-param>  
  22. <context-param>  
  23.         <description>请求超时时间/微妙[默认:60000,1分钟,建议至少设置3秒以上]</description>  
  24.         <param-name>Comet.Timeout</param-name>  
  25.         <param-value>60000</param-value>  
  26. </context-param>  
  27. <context-param>  
  28.         <description>连接空闲过期时间/微妙[默认:5000,5秒]</description>  
  29.         <param-name>Comet.ConnExpires</param-name>  
  30.         <param-value>5000</param-value>  
  31. </context-param>  
  32. <context-param>  
  33.         <description>连接检查频率/微妙[默认:5000,5秒]</description>  
  34.         <param-name>Comet.ConnFrequency</param-name>  
  35.         <param-value>5000</param-value>  
  36. </context-param>  
  37. <context-param>  
  38.         <description>缓存信息过期时间/微妙[默认:60000,1分种]</description>  
  39.         <param-name>Comet.CacheExpires</param-name>  
  40.         <param-value>60000</param-value>  
  41. </context-param>  
  42. <context-param>  
  43.         <description>缓存信息过期检查频率/微妙[默认:60000,1分种]</description>  
  44.         <param-name>Comet.CacheFrequency</param-name>  
  45.         <param-value>60000</param-value>  
  46. </context-param>  
  47. <context-param>  
  48.         <description>连接模式[auto(默认)/stream/lpool]</description>  
  49.         <param-name>Comet.WorkStyle</param-name>  
  50.         <param-value>auto</param-value>  
  51. </context-param>  
  52. <context-param>  
  53.         <description>开启调试[false(默认)/true]</description>  
  54.         <param-name>Comet.Debug</param-name>  
  55.         <param-value>false</param-value>  
  56. </context-param>  

转:http://blog.csdn.NET/pengpegv5yaya/article/details/16917319

 

分享到:
评论

相关推荐

    comet4j 自己写的消息推送 觉得实用

    【标题】"comet4j 自己写的消息推送 觉得实用" 提示我们讨论的是一个自定义实现的基于 Comet4j 的消息推送系统。Comet4j 是一个开源的 Java 框架,用于实现实时的、双向的、基于 HTTP 长连接的消息推送服务,它解决...

    javaweb实现后台向前台的消息推送 comet4j

    5. 消息推送:在Java后台,当需要推送消息时,可以通过Comet4j提供的API将消息发送到特定的客户端连接。例如,可以通过连接ID来识别并推送消息。 ```java CometManager manager = CometManagerFactory.create(); ...

    服务器推送技术之comet4j资源包

    Comet4j就是一种基于Java实现的服务器推送技术框架,旨在简化实时Web应用的开发过程。本资源包包含了实现Comet4j功能所需的关键组件,包括`comet4j.js`脚本文件和`comet4j-tomcat7.jar`服务器端库。 首先,让我们...

    web推送 comet技术

    总结来说,"web推送 Comet技术"利用了Comet4J框架和Tomcat7服务器,实现在Web应用中的实时数据推送。它挑战了传统的HTTP交互方式,提升了用户体验,但同时也带来了额外的系统管理和优化挑战。在开发过程中,理解...

    java 使用 comet4j 主动向客户端推送信息 简单例子

    Java 使用 Comet4j 主动向客户端推送信息是一个常见的实时通信技术,主要应用于构建WebSocket或长轮询等实时交互的应用场景。Comet4j 是一个基于 HTTP 长连接的服务器端框架,它允许服务器端主动向客户端推送数据,...

    Comet4J服务器端推送技术

    Comet4J是一个微型的即时推送框架,它分为服务端与客户端两部分,你只要将服务器端(JAR文件,目前仅支持Tomcat6、7)放入WEB-INF\lib,客户端(JavaScript文件)引入到页面,那么你的应用就具备了向客户端推送信息的...

    基于tomact,comet4j,java服务器端推送消息到web页面

    这个项目是基于tomcat,comet4j的技术来实现推送消息到web页面,可以直接导入,直接运行的,里面包含了项目所需要的comet4j-tomcat7.jar(tomcat7的就导入这个),comet4j.js(页面引入这个js),等jar包,对于想要学习...

    comet4j推送

    Comet4j是一种基于Java的实时通信框架,它主要用于实现服务器向客户端的高效、低延迟的数据推送技术。在Web开发中,传统的HTTP协议是请求-响应模式,即客户端发起请求,服务器响应,然后连接关闭。然而,对于需要...

    comet demo 向客户端推送例子

    总的来说,这个"comet demo"是一个学习和理解Comet技术的绝佳实践,可以帮助开发者掌握如何在Java Web环境中实现服务器向客户端的实时数据推送。通过深入研究和运行这个示例,你可以更好地了解HTTP长连接的工作原理...

    DWR+JAVA进行web消息推送dwr-comet.zip

    总结来说,DWR与Java结合的Web消息推送方案利用了Comet技术,提供了实时、双向的通信能力。通过在后端处理数据推送和前端与服务器的交互,可以构建出高性能、低延迟的实时Web应用。开发者在实际应用中,需根据项目...

    comet4j实例

    Comet4j是一个Java库,专门用于实现Comet技术,这是一种服务器推送技术,允许服务器向客户端实时推送数据,而不仅仅是响应客户端的请求。在Web应用中,这种技术常用于实现聊天室、股票报价、在线游戏等实时交互功能...

    comet4j推送Demo

    Comet4j是一个Java库,专门用于实现服务器向客户端的实时推送技术,它基于HTTP长连接,能够在Tomcat这样的Servlet容器环境下运行。在Web开发中,实时推送是让服务器能够主动将新数据推送给客户端,而不是传统的...

    comet4j 简单例子+文档

    Comet4j是一个Java框架,专门用于实现Comet技术,这是一种服务器推送技术,允许服务器向客户端实时推送数据,而不仅仅是响应客户端的请求。在Web应用中,这种技术常用于实现聊天、实时通知、股票更新等功能,它克服...

    comet4j-tomcat6.jar和comet4j-tomcat7.jar和comet4j.js

    3. 在Java代码中使用Comet4j API创建Comet服务端点,处理客户端的连接和数据推送。 4. 在Web应用的HTML页面中引入"comet4j.js",设置客户端的监听器,以便接收服务器推送的数据。 5. 测试和优化应用程序,确保其在...

    Comet4j推送

    总的来说,Comet4j提供了一个简单的接口,使得Java开发者可以轻松实现Web应用的实时推送功能。通过理解Comet4j的工作原理和示例代码,你可以快速地将这种技术应用于你的项目中,提升用户体验,实现更高效的交互。

    comet4j-tomcat7后台信息推送jar包

    总之,"comet4j-tomcat7后台信息推送jar包"是一个针对Tomcat7服务器的实时通信解决方案,它使得开发者能够轻松地实现Java后台向客户端浏览器的实时数据推送,极大地提升了Web应用的交互性和用户体验。在Java项目中...

    消息推送comet4jjar包

    标题中的“消息推送comet4jjar包”指的是一个用于实现服务器向客户端实时推送消息的框架,主要针对的是IE8及以上的浏览器。Comet4j是这个框架的名称,它是一个基于Java技术构建的长连接通信框架,适用于需要双向通信...

    java comet服务器推送使用步骤

    本文将详细介绍如何使用Comet4J框架来实现Java Comet服务器推送。 #### 二、Comet4J简介 Comet4J是一个基于Java的轻量级Comet框架,它能够帮助开发者轻松地实现实时数据推送功能。Comet4J支持多种服务器环境,并且...

    comet4j-tomcat7.jar comet4j.js

    4. **Comet4j API**:深入学习Comet4j的API,掌握如何创建服务器端的推送通道,发送和接收消息,以及管理客户端连接。 5. **JavaScript交互**:理解`comet4j.js`中的函数,如何在客户端初始化连接,接收推送事件,...

    comet4j-tomcat6,comet4j-tomcat7,comet4j.js,以及一个样例

    3. 在Java后端,创建Comet4J处理类,该类负责处理客户端的连接并推送数据。 4. 使用`comet4j.js`在前端页面中建立连接,订阅需要的数据更新,并处理来自服务器的推送。 5. 测试应用,确保长连接能够正常工作,数据推...

Global site tag (gtag.js) - Google Analytics