comet4j java服务端推送消息到web页面实例

来源:互联网 发布:阿巴町手表软件下载 编辑:程序博客网 时间:2024/06/05 03:10
官网: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 plaincopy01.<Connector executor="tomcatThreadPool" port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />   替换为: [html] view plaincopy01.<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>   客户端 我们利用Comet4J开发一个每隔一秒向所有客户端推送服务器的剩余内存大小。 helloworld.html [html] view plaincopy01.<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  02.<html xmlns="http://www.w3.org/1999/xhtml">  03.<head>  04.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  05.<title>Comet4J Hello World</title>  06.<script type="text/javascript" src="js/comet4j-0.0.2.js"></script>  07.<script type="text/javascript">  08.function init(){  09.        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 plaincopy01.package org.comet4j.demo.helloworld;  02.  03.import javax.servlet.ServletContextEvent;  04.import javax.servlet.ServletContextListener;  05.  06.import org.comet4j.core.CometContext;  07.import org.comet4j.core.CometEngine;  08.  09.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 plaincopy01.<listener>  02.                <description>Comet4J容器侦听</description>  03.                <listener-class>org.comet4j.core.CometAppListener</listener-class>  04.        </listener>  05.        <servlet>  06.                <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  07.                <display-name>CometServlet</display-name>  08.                <servlet-name>CometServlet</servlet-name>  09.                <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 plaincopy01.JS.Engine.start('/conn');   上段代码我们让浏览器与服务器进行连接,当连接成功以后JS.Engine类会发出"start"事件,如何进行事件的处理我们稍后介绍。 JS.Engine.stop方法 我们也能够让连接断开: [javascript] view plaincopy01.JS.Engine.stop('主动断开');   上面代码我们让连接断开,并传入了一个“主动断开”这样一个断开的原因。如果您并不需要对断开的原因进行说明,也可以不传递参数: [javascript] view plaincopy01.JS.Engine.stop();   JS.Engine类的事件处理 上面我们介绍了如何使用start和stop方法来建立和断开连接,当成功建立连接已后JS.Engine会发出"start"事件,当断开后会发出“stop”事件,当收到某个通道推送过来的信息时也会发出与通道标识同名的事件。您可以事先在中使用JS.Engine.on方法来注册事件处理函数。例如: [javascript] view plaincopy01.JS.Engine.on('start',function(cId, channelList, engine){  02.    alert('连接已建立,连接ID为:' + cId);  03.});  04.JS.Engine.on('stop',function(cause, cId, url, engine){  05.    alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);  06.});   也可以将上段代码写成,下面代码与上段代码完全等效: [javascript] view plaincopy01.JS.Engine.on({  02.    start : function(cId, channelList, engine){  03.      alert('连接已建立,连接ID为:' + cId);  04.    },  05.    stop : function(cause, cId, url, engine){  06.      alert('连接已断开,连接ID为:' + cId + ',断开原因:' + cause + ',断开的连接地址:'+ url);  07.    }  08.});   接下来,介绍一下如何对服务器推送过来的消息进行处理。在介绍之前,我们假设后台已经注册了一个"hello"的应用通道标识,并且只向客户端推送简单的字符串信息。先看如下代码: [javascript] view plaincopy01.JS.Engine.on('hello',function(text){  02.    alert(text);  03.});   这样当服务器端使用"hello"通道标识推送过来的消息就可以由上段代码进行处理,将推送过来的信息弹出。 特别注意:以上代码在事件处理函数中使用了alert仅为说明函数功能,实际使用中,在事件处理函数中切勿使用alert、prompt、confirm等可以中断脚本运行的函数,因为Engine需要实时的保持工作状态。 服务器端使用简介 服务端由一个Jar包组成,其中最重的是CometContext和CometEngine两个类。 Comet Context 类 CometContext是一个单态类,通过其getInstance方法来获得实例,它主要负责框架的一些初始化工作保存着一些参数的配置值,除此之外它还有一个更重要的职责——负责注册应用通道标识。如果您想使用框架来实现自己的应用,那么您必需要为自己的应用分配一个唯一的通道标识,并将此通道标识在WEB容器启动时使用CometContext的registChannel方法进行注册,这样,客户端才可以正确接受此应用所推送的消息。注册一个通道标识非常简单 [java] view plaincopy01.CometContext.getInstance().registChannel("hello");   这样便注册了一个标识为“hello”的应用通道,而客户也可以通过JS.Engine.on('hello',function(msg){...})的形式来接收并处理来自此通道的消息。 Comet Engine 类 另一个重要的类是CometEngine,它除了负责对连接的处理之外,对于开发人员而言,更加常用的可能是它所提供的sendTo或sendToAll方法来向客户端发送消息: [java] view plaincopy01.ring channel = "hello";  02.String someConnectionId = "1125-6634-888";  03.engine.sendToAll(channel , "我来了!");  04.engine.sendTo(channel , engine.getConnection(someConnectionId),“Hi,我是XXX”);   上面代码使用sendToAll方法向所有客户端在"hello"通道上发送了“我来了!”这样一条消息,然后又使用sendTo在同样的通道上向某一个连接发送了“Hi,我是XXX”消息。 CometEngine另外一个很重要的地方在于,它是框架工作的事件引擎的集散地,它提供了BeforeConnectEvent、BeforeDropEvent、ConnectEvent、DropEvent、MessageEvent等事件。通过对这些事件的处理来实现具体的功能: [java] view plaincopy01.class JoinListener extends ConnectListener {  02.        @Override  03.        public boolean handleEvent(ConnectEvent anEvent) {  04.                CometConnection conn = anEvent.getConn();  05.                CometContext.getInstance().getEngine().sendTo("hello", conn.getId(),"欢迎上线");  06.        }  07.}  08.  09.CometEngine engine = CometContext.getInstance().getEngine();  10.engine.addConnectListener(new JoinListener()   上面先定义了一个JoinListener并实现了父类ConnectListener的handleEvent抽像方法,然后使用engine.addConnectListener来注册这个事件侦听。这样,在有客户与服务器成功建立连接已后,就可以向此客户端推送一条欢迎信息。 Comet4J配置参数表 [html] view plaincopy01.<!--Comet4J配置 -->  02.<listener>  03.        <description>Comet4J容器侦听</description>  04.        <listener-class>org.comet4j.core.CometAppListener</listener-class>  05.</listener>  06.<servlet>  07.        <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>  08.        <display-name>CometServlet</display-name>  09.        <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>  
servlet 会配置拦截/conn的请求 转到comet  
页面js start方法参数是 服务器后台注册的通道名称
 


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2007cad打开时时死机怎么办 手机qq总是无响应怎么办 英雄联盟登录服务器未响应怎么办 苹果7p照相死机怎么办 小米手机qq打不开怎么办啊 电脑qq老是闪退怎么办 微信摄像卡住了怎么办 电脑打开应用程序没反应怎么办 宇飞来手机锁了怎么办 宇飞来手机忘记密码怎么办 vivo手机突然开不了机怎么办 苹果六关不了机怎么办 微信老是无响应怎么办 打游戏被骂了怎么办 微信运动跳转排行榜失败怎么办 小恩爱账号忘了怎么办 华为账号更换后游戏账号怎么办 注册游戏账号需要身份证怎么办 英雄联盟被裁决了怎么办 百度网盘密码重置不了怎么办 sap密码输入被锁怎么办 dnf二级密码错10怎么办 大网卡网速慢了怎么办 小米路由器无线速度慢怎么办 小米手机无线速度慢怎么办 电脑网卡驱动没了怎么办 电脑显示网卡驱动不正常怎么办 微信别人拒收消息怎么办 电脑无线网卡速度慢怎么办 网吧吃鸡更新慢怎么办 手机号注册不了微信怎么办 小米账号密码忘了怎么办 小米手机账号密码忘了怎么办 华为手机账号密码忘记了怎么办 老年机开不了机怎么办 天谕没有顺网登陆怎么办 苹果密保问题忘了怎么办 密保手机没用了怎么办 qq密保手机没用了怎么办 手机开机按钮坏了怎么办 改了账号游戏角色消失怎么办