`

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

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

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

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

    这是一个利用comet4j第三方插件,实现javaweb项目中后台消息向前台推送的一个功能,前台只要利用jquery,后台是用java实现,tomcat用7的版本

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

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

    javaweb消息推送 基于comet实现局域网内部通讯(聊天室)demo

    javaweb消息推送 基于comet实现局域网内部通讯(聊天室)demo 功能特性 推送消息广播。 推送定向消息。 提供连接上线前、上线、下线前、下线、发送消息等多种可处理事件。 消息缓存机制,确保长轮询工作模式下不丢失...

    comet demo 向客户端推送例子

    通过tomcat服务器,向网页发送即时消息。comet的小例子,可以直接运行,用tomcat6.0。

    comet4j-tomcat6.jar|comet4j-tomcat7.jar下载_以及对Jfinal类以及Zcurd项目的支持

    Comet4j为针对java web项目的后台消息推送工具,支持后台主动往浏览器推送消息。附件rar包提供Comet4j基础资源包下载,适用于所有Comet4j项目,同时特别针对comet4j对Jfinal类以及Zcurd项目的支持做了一些注意事项...

    comet4j.jar

    JAVA web服务器推送组件,在客户端可以收到服务端推送的消息。

    comet4J文件集合需要集合

    Java Web 推送服务 所需要的Jar包、js文件 、Demo

    JavaWeb后台自动向前台发送消息

    JavaWeb项目后台向前推送消息,主要是是利用第三方包Comet4J,附件中是MyEclipse开发的源码,可直接运行。

    源码部署javaTomcat-cometd:CometD项目,用于Web消息传递的可扩展Comet(服务器推送)实现

    的可扩展彗星(服务器推送)实现。 CometD 版本 7.0.x ⇒ Java 11 - Jetty 11.0.x - jakarta.servlet.* 6.0.x ⇒ Java 11 - 码头 10.0.x - javax.servlet.* 5.0.x ⇒ Java 8 - 码头 9.4.x - javax.servlet.* CometD...

    java websocket

    这种客户端是主动方,服务端是被动方的传统Web模式 对于信息变化不频繁的Web应用来说造成的麻烦较小,而对于涉及实时信息的Web应用却带来了很大的不便,如带有即时通信、实时数据、订阅推送等功能的应 用。...

    hipush:使用netty的分布式推送服务器

    web服务器,客户端选择comet服务器,netty admin服务器,消息发送,netty zookeeper服务发现curator redis存储jedis nginx路由web和admin服务器 http调用unirest supervisor进程监控 maven exec运行进程 自定义二...

    javaweb聊天室源码下载-WebRTC_IM:webrtc直播连麦

    一个支持集群的im及实时推送服务。 特性 轻量级 高性能 纯Golang实现 支持单个、多个、单房间以及广播消息推送 支持单个Key多个订阅者(可限制订阅者最大人数) 心跳支持(应用心跳和tcp、keepalive) 支持安全验证...

    pushlet.jar(2.0.4)

    Pushlet是一种comet实现:在Servlet机制下,数据从server端的Java对象直接推送(push)到(动态)HTML页面,而无需任何Java applet或者插件的帮助。它使server端可以周期性地更新client的web页面,这与传统的request...

    ajax调用java实例源码-Lightstreamer-example-HelloWorld-client-[removed]Light

    Lightstreamer”系列的演示是非常基本的示例,我们将交替的字符串“Hello”和“World”,后跟当前时间戳,从服务器推送到浏览器。 该项目包括“Hello World”教程的 Web 客户端前端:一个简单的 HTML 页面,显示...

    WebSocket客户端和服务端实例源码

    尤其在当前业界移动互联网蓬勃发展的趋势下,高并发与用户实时响应是 Web 应用经常面临的问题,比如金融证券的实时信息,Web 导航应用中的地理位置获取,社交网络的实时消息推送等。 传统的请求-响应模式的 Web 开发...

    JavaScript权威指南(第6版)中文文字版

    18.3 基于服务器端推送事件的comet技术 508 第19章 jquery类库 514 19.1 jquery基础 515 19.2 jquery的getter和setter 522 19.3 修改文档结构 528 19.4 使用jquery处理事件 531 19.5 动画效果 542 19.6 jquery中的...

    JavaScript权威指南(第6版)

    18.3 基于服务器端推送事件的comet技术 508 第19章 jquery类库 514 19.1 jquery基础 515 19.2 jquery的getter和setter 522 19.3 修改文档结构 528 19.4 使用jquery处理事件 531 19.5 动画效果 542 19.6 jquery中的...

Global site tag (gtag.js) - Google Analytics