comet4j开发指南

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

准备工作

下载服务端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 plain copy

  1. <Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />

替换为:

[html] view plain copy

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

客户端

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

[html] view plain copy

  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 plain copy

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

配置

web.xml

[html] view plain copy

  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. <listener>
  16. <description>HelloWorld</description>
  17. <listener-class>org.comet4j.demo.helloworld.HelloWorld</listener-class>
  18. </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 plain copy

  1. JS.Engine.start(‘/conn‘);

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

JS.Engine.stop方法

我们也能够让连接断开:

[javascript] view plain copy

  1. JS.Engine.stop(‘主动断开‘);

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

[javascript] view plain copy

  1. JS.Engine.stop();

JS.Engine类的事件处理

上面我们介绍了如何使用start和stop方法来建立和断开连接,当成功建立连接已后JS.Engine会发出"start"事件,当断开后会发出“stop”事件,当收到某个通道推送过来的信息时也会发出与通道标识同名的事件。您可以事先在中使用JS.Engine.on方法来注册事件处理函数。例如:

[javascript] view plain copy

  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 plain copy

  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 plain copy

  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 plain copy

  1. CometContext.getInstance().registChannel("hello");

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

Comet Engine 类

另一个重要的类是CometEngine,它除了负责对连接的处理之外,对于开发人员而言,更加常用的可能是它所提供的sendTo或sendToAll方法来向客户端发送消息:

[java] view plain copy

  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 plain copy

  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. CometEngine engine = CometContext.getInstance().getEngine();
  9. engine.addConnectListener(new JoinListener()

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

Comet4J配置参数表

[html] view plain copy

  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>

时间: 2024-12-28 01:35:07

comet4j开发指南的相关文章

【资源共享】Rockchip I2C 开发指南 V1.0

2C设备的设备应用非常广泛,常见的包含重力传感器,触摸屏驱动芯片,音频解码等 这个文档是RK3399的I2C开发文档:<Rockchip I2C 开发指南 V1.0> 内容预览: 下载地址:http://developer.t-firefly.com/thread-12495-1-1.html

七日Python之路--第十二天(Django Web 开发指南)

<Django Web 开发指南>.貌似使用Django1.0版本,基本内容差不多,细读无妨.地址:http://www.jb51.net/books/76079.html (一)第一部分 入门 (1)内置数字工厂函数 int(12.34)会创建一个新的值为12的整数对象,而float(12)则会返回12.0. (2)其他序列操作符 连接(+),复制(*),以及检查是否是成员(in, not in) '**'.join('**')   或  '***%s***%d' % (str, int)

开发指南专题八:JEECG微云快速开发平台数据字典

   开发指南专题八:JEECG微云快速开发平台数据字典的使用 1.标签中使用数据字典 数据字典为系统中可能用到的字典类型数据提供了使用的便利性和可维护性.以下拉框标签<t:dictSelect>为例进行讲解 1.1. 标签参数 属性名 类型 描述 是否必须 默认值 typeGroupCode string 字典分组编码 是 null field string 对应表单 是 null id string 唯一标识 否 null title string 显示文本 否 null defaul

C#在Linux上的开发指南(续)

续之前的一篇开发指南http://www.cnblogs.com/RainbowInTheSky/p/5496777.html 部分人在部署的时候经常出现dll兼容问题(其实可以看小蝶惊鸿的文章,蝶神早已踩过了坑http://www.cnblogs.com/xiaodiejinghong/tag/mono/) 站点部署后建议使用webbench进行压力测试 1.Microsoft.Web.Infrastructure.dll不用上传,mono已经实现(MS的dll有api依赖的问题),Mono的

《NodeJS开发指南》学习笔记

欢迎大家指导与讨论 : ) 注:此笔记是基于<NodeJS开发指南>,并不是原著. 第一章——NodeJS简介 NodeJS是一个可以让Javascript运行在服务器端的平台,它为实时Web应用(Real-time Web)开发而生.拥有实时响应,超大规模数据要求下架构的可扩展性.它采用了单线程.异步式I/O.事件驱动式的程序设计模型.统意义上,Javscript是由ECMA.DOM.BOM组成. NodeJS采用的是单线程模型,对于所有的I/O都采用异步式的请求方式,避免了频繁的上下文切换

Angularjs中文版本开发指南发布

Angularjs中文版本开发指南发布 2014-02-16 15:49 by 破狼, 29069 阅读, 9 评论, 收藏,  编辑 从本人开始在写关于Angularjs的文章开始,也算是见证了Angularjs在国内慢慢的火起来,如今的Angularjs正式如日中天.想知道为什么Angularjs会这么火,请移步angularjs移除不必要的$watch. 也是一次偶然的机会,在Angular.js中文社区群里相遇一群Angular的爱好者,在一次巧妙的交谈,大家对于Angular官方的Gu

开发指南专题十:JEECG微云快速开发平台--表单校验组件ValidForm

10.4Validform对象[方法支持链式调用] 如示例 var demo=$(".formsub").Validform(),那么demo对象会有以下属性和方法可以调用: tipmsg[object] 如:demo.tipmsg.s="error! no messageinputed."; 通过该对象可以修改除 tit 以外的其他提示文字,这样可以实现同一个页面的不同表单使用不同的提示文字. 具体可修改的提示文字 $.Tipmsg={//默认提示文字; tit:

开发指南专题五:JEECG微云快速开发平台代码生成器

开发指南专题五:JEECG微云快速开发平台代码生成器 1.1. Maven开发环境搭建 在搭建jeecg的maven开发环境之前,需要先配置好本机的maven环境,并在eclipse中安装好m2eclipse插件. 1. maven版本的工程目录,代码结构如图311所示. 2. 针对本机开发环境(这里以eclipse为例),调整依赖包和项目属性 首先在工程上右键->properties,在builders选项卡中删除掉不存在或不需要的builders,如图312所示. 然后进入Java Bu

开发指南专题五:JEECG微云高速开发平台代码生成器

开发指南专题五:JEECG微云高速开发平台代码生成器 1.1. Maven开发环境搭建 在搭建jeecg的maven开发环境之前,须要先配置好本机的maven环境,并在eclipse中安装好m2eclipse插件. 1. maven版本号的project文件夹,代码结构如图311所看到的. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhbmdkYWlzY290dA==/font/5a6L5L2T/fontsize/400/fill/I0JBQ