`
zengshaotao
  • 浏览: 792469 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 使用 comet4j 主动向客户端推送信息

    博客分类:
  • java
 
阅读更多

原文地址:http://www.2cto.com/kf/201408/323658.html

 

今天,一个前端的师弟问我怎样做实时聊天窗口,我毫不犹豫地说:在前台定时访问服务端呀!师弟默默地百度了一番,最后告诉我,有一种技术是后服务端动推送信息给客户端的,这种技术的名字叫comet,我惊呆了,因为完全没听过,赶紧上网搜集资料,耗了一个晚上写了个简单的例子,实现主动向客户端发送信息。说是说主动,其实还是要客户端先献出它的“第一次”,即只要它有先请求你一下,以后你们熟了,你想主动约它就约它!

 
  关于comet技术介绍及其实现原理,可以参考网站 http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ 的介绍。
 
  简单来说,就是客户端发送请求到服务端,服务器端会阻塞请求直到有数据传递或超时才返回,之后客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。  
 
 
 
【工作环境】
 
1、myeclipse2013
 
2、tomcat 6.0
 
3、jdk 7
 
4、火狐浏览器
 
说明: 
 
测试成功的浏览器有:(1)火狐浏览器  (2)IE10、IE9、IE8  (3)360极速浏览器极速模式
 
测试失败的浏览器有:(1)IE10兼容模式、IE7
 
  
 
【准备工作】
 
1、下载comet4j.js  :http://files.cnblogs.com/xiaoMzjm/comet4j.js.rar
 
2、下载comet4j-tomcat6.jar  :http://files.cnblogs.com/xiaoMzjm/comet4j-tomcat6.jar.rar
 
3、到tomcat目录下——conf——server.xml 下,把
 
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
修改成:
 
<Connector URIEncoding="UTF-8" 
    connectionTimeout="20000"
     port="8080"  
     protocol="org.apache.coyote.http11.Http11NioProtocol"
     redirectPort="8443"
/>  
说明: 
 
其实那个js文件和jar官网是https://code.google.com/p/comet4j/ 的,但它是谷歌,这里是天朝呐,所以贴了两个我文件夹里面的包的地址上来。    
 
comet4j-tomcat6.jar 还有另一个版本是 comet4j-tomcat7.jar , 自己选择合适的版本去下载。6以下的tomcat肯定不行就对了。
 
comet4j.js 的官方使用文档: http://doc.comet4j.tk/jsdocs/
 
comet4j-tomcat6.jar 的官方使用文档:   http://doc.comet4j.tk/apidocs/
 
  
 
【新建项目过程】
 
(1)新建服务端的类TestComet , 实现  ServletContextListener  接口
 
(2)在web.xml 里面应该配置 拦截器:
 
复制代码
    <listener>
        <listener-class>org.comet4j.core.CometAppListener</listener-class>
    </listener>
    <listener>
        <description>HelloWorld</description>
        <listener-class>com.zjm.www.test.TestComet</listener-class>
    </listener>
    <servlet>
        <display-name>CometServlet</display-name>
        <servlet-name>CometServlet</servlet-name>
        <servlet-class>org.comet4j.core.CometServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CometServlet</servlet-name>
        <url-pattern>/conn</url-pattern>
    </servlet-mapping>
复制代码
 
 
注:其中的要配置的有两个地方
 
一个是comet4j-tomcat6.jar下的一个servlet:org.comet4j.core.CometServlet , 客户端访问的入口
 
另一个是comet4j-tomcat6.jar下的监听器:org.comet4j.core.CometAppListener , 监听我们自己的类。
 
 
 
【具体代码(说明都写在注释里面)】
 
1、web.xml
 
 
复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7     <listener>
 8         <listener-class>org.comet4j.core.CometAppListener</listener-class>
 9     </listener>
10     <listener>
11         <description>HelloWorld</description>
12         <listener-class>com.zjm.www.test.TestComet</listener-class>
13     </listener>
14     <servlet>
15         <display-name>CometServlet</display-name>
16         <servlet-name>CometServlet</servlet-name>
17         <servlet-class>org.comet4j.core.CometServlet</servlet-class>
18     </servlet>
19     <servlet-mapping>
20         <servlet-name>CometServlet</servlet-name>
21         <url-pattern>/conn</url-pattern>
22     </servlet-mapping>
23 
24     
25   <welcome-file-list>
26     <welcome-file>index.jsp</welcome-file>
27   </welcome-file-list>
28 </web-app>
复制代码
 
 
2、java类TestComet
 
里面附上了不少的注释,如果想仔细研究建议看上面的赋予的API文档链接。
 
 
复制代码
 1 package com.zjm.www.test;
 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 /**
10  * 描述:服务端主动推送消息到客户端  简单例子
11  * @author zjm
12  * @time 2014/8/7
13  */
14 public class TestComet implements ServletContextListener {
15     
16         // 频道1
17         private static final String CHANNEL1 = "result1";
18         // 频道2
19         private static final String CHANNEL2 = "result2";
20         
21         // 通过频道1推送给前台的变量1
22         private static int number1 = 0 ;
23         // 通过频道2推送给前台的变量2
24         private static int number2 = 100 ;
25         
26         /**
27          * 初始化上下文
28          */
29         public void contextInitialized(ServletContextEvent arg0) {
30             
31                 // CometContext : Comet4J上下文,负责初始化配置、引擎对象、连接器对象、消息缓存等。
32                 CometContext cc = CometContext.getInstance();
33                 // 注册频道,即标识哪些字段可用当成频道,用来作为向前台传送数据的“通道”
34                 cc.registChannel(CHANNEL1);
35                 cc.registChannel(CHANNEL2);
36                 
37                 Thread myThread = new Thread(new SendToClientThread(), "SendToClientThread");
38                 // 下面的内部类的方法是个死循环,设置helloAppModule线程为“守护线程”,则当jvm只剩“守护线程”时(主线程结束),该线程也会结束。
39                 myThread.setDaemon(true);
40                 // 开始线程
41                 myThread.start();
42         }
43 
44         /**
45          * 内部类线程类
46          */
47         class SendToClientThread implements Runnable {
48                 public void run() {
49                         while (true) {
50                                 try {
51                                         Thread.sleep(1000);
52                                 } catch (Exception ex) {
53                                         ex.printStackTrace();
54                                 }
55                                 // CometEngine : 引擎,负责管理和维持连接,并能够必要的发送服务
56                                 CometEngine engine = CometContext.getInstance().getEngine();
57                                 // 参数的意思:通过什么频道(CHANNEL1)发送什么数据(number1++),前台可用可用频道的值(result1)来获取某频道发送的数据
58                                 engine.sendToAll(CHANNEL1, number1++);
59                                 engine.sendToAll(CHANNEL2, number2++);
60                         }
61                 }
62         }
63 
64         public void contextDestroyed(ServletContextEvent arg0) {
65         }
66 }
复制代码
 
 
3、客户端代码
 
 
复制代码
 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.js"></script>
 7 <script type="text/javascript">
 8 function init(){
 9     
10         var number1 = document.getElementById('number1');
11         var number2 = document.getElementById('number2');
12         // 建立连接,conn 即web.xml中 CometServlet的<url-pattern>
13         JS.Engine.start('conn');
14         // 监听后台某个频道
15         JS.Engine.on(
16                { 
17                    // 对应服务端 “频道1” 的值 result1
18                    result1 : function(num1){
19                        number1.innerHTML = num1;
20                 },
21                 // 对应服务端 “频道2” 的值 result2
22                 result2 : function(num2){
23                        number2.innerHTML = num2;
24                 },
25             }
26            );
27 }
28 </script>
29 </head>
30 <body onload="init()">
31         数字1:<span id="number1">...</span><br></br>
32         数字2:<span id="number2">...</span>
33 </body>
34 </html>
分享到:
评论

相关推荐

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

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

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

    基于服务器推送框架 Comet4J ,后台模拟实时生成 gps 坐标信息然后再推送到前端页面显示。...这是客户端主动向服务器发起请求的方式,而采用 comet4j框架来实现正好相反,是服务器主动向客户端来推送消息。

    comet demo 向客户端推送例子

    在Web应用中,通常的HTTP请求是客户端发起的,而Comet打破了这种模式,使得服务器可以在适当的时候主动向客户端推送信息,极大地提升了实时性。 这个"comet demo"是一个展示如何在Java环境下利用Tomcat服务器实现...

    comet4j向客户端推送

    总的来说,Comet4j是一种高效、便捷的Java实现的服务器端向客户端推送技术,它简化了实时通信的开发过程,特别适合那些需要频繁数据更新的应用场景。通过使用Comet4j,开发者可以专注于业务逻辑的实现,而无需过多地...

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

    Comet4j 是一个开源的 Java 框架,用于实现实时的、双向的、基于 HTTP 长连接的消息推送服务,它解决了传统 HTTP 请求响应模式下难以实现服务器主动向客户端推送信息的问题。 在 Web 应用中,消息推送技术是必不可...

    Comet4J服务器端推送技术

    目前仅支持Tomcat6、7)放入WEB-INF\lib,客户端(JavaScript文件)引入到页面,那么你的应用就具备了向客户端推送信息的能力,而你仅需要在服务器端调用Comet4J所提供发送方法,信息就会被主动的推送到客户的浏览器上...

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

    在JavaWeb开发中,实时通信是一项重要的功能,它允许服务器主动向客户端推送数据,而不仅仅是响应客户端的请求。本示例介绍的是如何使用Comet4j这个第三方库来实现后台到前台的消息推送功能。Comet4j是一个专门用于...

    Java 实现 Comet 长连接,服务器主动发送消息给客户端

    这种模式突破了传统的 HTTP 请求-响应模式,使得服务器可以主动向客户端推送数据,提高了实时性。 Comet 技术主要分为两种实现方式:HTTP 长轮询(Long Polling)和 HTTP 流(HTTP Streaming)。长轮询是客户端发起...

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

    3. 服务器端编程:在Java后端,通过Comet4j提供的API创建推送通道,处理客户端的请求,以及主动向客户端推送数据。 4. 性能优化:由于Comet技术涉及到长时间的HTTP连接,因此需要考虑服务器的并发处理能力,以及...

    DWR3实现服务器端向客户端精确推送消息

    要实现服务器端向客户端的精确推送,DWR3提供了“Reverse Ajax”或者称为“Comet”技术。Comet是一种使服务器能够长时间保持HTTP连接开放的技术,以便在需要时向客户端发送更新。这种长轮询或流式传输的方式,使得...

    comet4j推送

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

    Comet4j推送

    服务器端的代码可能会创建一个Comet服务,监听特定的URL,并在有新数据时通过这个连接向客户端推送。客户端则会建立一个持久的HTTP连接,等待服务器的推送。 在Java中实现Comet4j推送,你需要做以下几步: 1. 引入...

    comet4j实例

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

    comet4j 所需js以及comet4j-tomcat6.jar、comet4j-tomcat7.jar包

    Comet4j是一种基于Java的实时通信框架,它利用了HTTP长连接技术,实现了服务器向客户端的高效、低延迟的消息推送。在这个压缩包中,包含了Comet4j框架运行所必需的一些关键组件。 首先,`comet4j.js`是Comet4j的...

    comet4j-tomcat7后台信息推送jar包

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

    comet4j推送Demo

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

    java comet服务器推送使用步骤

    Comet作为一种实现服务器向客户端推送数据的技术方案,在早期的Web应用中扮演了重要的角色。Java Comet框架为开发者提供了一种简单而有效的方式来实现这一功能。本文将详细介绍如何使用Comet4J框架来实现Java Comet...

    comet4j需要的jar与js

    而Comet4j通过使用长连接技术,使得服务器可以在有新数据时主动向客户端推送,极大地提高了实时性。 标题“comet4j需要的jar与js”表明我们需要关注两个关键文件类型:`.jar` 和 `.js`。`.jar` 文件是Java的归档...

    comet4j简单工程demo

    1. **服务器端代码**:可能包含一个或多个实现了Comet4j接口的Servlet,这些Servlet负责接收客户端的连接请求,存储连接状态,并在需要时向客户端推送数据。 2. **配置文件**:比如web.xml,用于配置Comet4j的...

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

    Comet4j是一个Java库,专门用于在Tomcat应用服务器上实现Comet技术,这是一种用于创建持久性HTTP连接的方法,从而实现服务器向客户端推送数据的功能。这种技术在实时Web应用程序中非常有用,例如在线聊天、股票报价...

Global site tag (gtag.js) - Google Analytics