Long Polling (Comet4j)推送

Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。自己查了很多资料,要是传输一个对象要先把对象转换成json对象,客户端不需要对这个json数据进行转换,由于comet4j.js内部已将json格式转换成javascript对象。不得不说这个comet4j推送很方便,当然这是个人观点。希望大家多交流交流这个插件。下面是我的代码:

准备工作

1.下载服务端jar文件

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

2.下载客户端js文件

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

3.修改服务器配置文件

因为Comet4J工作在NIO方式下,所以我们需要调整服务器连接器配置,更换为NOI连接器。 打开server.xml文件将找到原先的连接器配置:
 <Connector executor="tomcatThreadPool" 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"/>
服务器端代码:

package com.hfxt.action;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;


import net.sf.json.JSONObject;


import org.comet4j.core.CometContext;
import org.comet4j.core.CometEngine;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;


import com.hfxt.entity.Photo;
import com.hfxt.service.PhotoService;
public class PhotoListener implements ServletContextListener{

private static final String CHANNEL = "hello";
private static String fileName="";
private Photo photo;
protected Logger log = LoggerFactory.getLogger(this.getClass());


public static String getFileName() {
return fileName;
}
public static void setFileName(String fileName) {
PhotoListener.fileName = fileName;
}
@Override
public void contextInitialized(ServletContextEvent sce) {
CometContext cc = CometContext.getInstance();
         cc.registChannel(CHANNEL);//注册应用的channel
         Thread helloAppModule = new Thread(new HelloAppModule(), "Sender App Module");
         helloAppModule.setDaemon(true);
         helloAppModule.start();
}

class HelloAppModule  implements Runnable {
         public void run() {
                 while (true) {
                         try {            
                        Thread.sleep(3000);
                                 CometEngine engine = CometContext.getInstance().getEngine();                   
                                if(!"".equals(fileName)){
                                ApplicationContext ac = new FileSystemXmlApplicationContext("classpath:applicationContext.xml");//和ssh联合使用的这里获取bean,就是获取这个bean然后把这个photo保存到数据库里。
                                PhotoService photoService = (PhotoService) ac.getBean("photoService");
                                photo = new Photo();
                                photo.setPhotoName(fileName);
                               
                                photoService.doAddPhoto(photo);
                                photo = photoService.getPhotoByName(fileName);
        engine.sendToAll(CHANNEL,JSONObject.fromObject(photo));      
        fileName = "";
                                }
                                 } catch (Exception e) {
                               e.printStackTrace();
                                 log.info("PhotoListener bug:{}",e);
                         }                    
                         }
                 }
         }
@Override
public void contextDestroyed(ServletContextEvent sce) {
}

}

页面代码:

<script type="text/javascript">
jQuery(document).ready(function($) {

 function long_polling() {
         JS.Engine.on({
                hello : function(data){//侦听一个channl
                  alert(data.photoName);//获取图片的名称
                }
        });
        JS.Engine.start(‘conn');     
            }
            long_polling();

});

配置

web.xml

<listener>
                <description>Comet4J容器侦听</description>
                <listener-class>org.comet4j.core.CometAppListener</listener-class>
        </listener>
        <servlet>
                <description>Comet连接[默认:org.comet4j.core.CometServlet]</description>
                <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>
<listener>
  <description>PhotoListener</description>
  <listener-class>com.hfxt.action.PhotoListener</listener-class>

</listener>

附带comet4j官网https://code.google.com/p/comet4j/

Comet4J(Comet for Java)是一个纯粹基于AJAX(XMLHTTPRequest)的服务器推送框架,消息以JSON方式传递,具备长轮询、长连接、自动选择三种工作模式。 功能特性 推送消息广播。 推送定向消息。 提供连接上线前、上线、下线前、下线、发送消息等多种可处理事件。 消息缓存机制,确保长轮询工作模式下不丢失消息。 客户端正常下线,服务端可立即感知。 客户端异常停止工作,服务端可定时检查并感知。 以注册通道应用的方式,让开发者对框架功能进行扩展,实现自己的应用。 框架特性 独立小巧,不依赖于第三方包。 与应用紧密集成,无需独立应用或服务器。 与Session无关的连接机制,为开发人员提供最大程度的功能可控性。 面向事件编程,客户端与服务器端均为事件驱动开发模式,提供了良好的可扩展性机制。 各项性能参数均可配置。 支持多种主流浏览器,并支持Air应用环境。 服务器支持情况 Tomcat6、Tomcat7 浏览器支持情况 支持XMLHTTPRequest对象的浏览器均可支持长轮询工作模式,但不一定能够支持长连接。 | 浏览器/平台 | 版本 | 长轮询 | 长连接 | |:-----------|:-------|:--------|:--------| | Internet Explorer | 6,7,8,9 | √ | X | | FireFox | 3.0+(更底版本未知) | √ | √ | | Chrome | 7.0+(更底版本未知) | √ | √ | | Safari | 5+(更底版本未知) | √ | √ | | Opera | 11.10+(更底版本未知) | √ | X | | Air | 1.5+(更底版本未知) | √ | √ | | IOS(Iphone/Ipad)| 3.1+(更底版本未知) | √ | √ | | Android | 未测试 | 未知 | 未知 | | BlackBerry | 未测试 | 未知 | 未知 |
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值