1.1 Comt4j
1.1.1 介绍
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 | 未测试 | 未知 | 未知 |
对比参考: Pushlet实例解析 与 Servlet3.0 服务端推技术
1.1.2 服务端
package org.comet4j.demo.helloworld; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import org.comet4j.core.CometContext; import org.comet4j.core.CometEngine; public class HelloWorld implements ServletContextListener { private static final String CHANNEL = "hello";
public void contextInitialized(ServletContextEvent arg0) { CometContext cc = CometContext.getInstance(); cc.registChannel(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(1000); } catch (Exception ex) { ex.printStackTrace(); }
CometEngine engine = CometContext.getInstance().getEngine(); // 推送当前服务器的剩余内存大小 engine.sendToAll(CHANNEL, Runtime.getRuntime().freeMemory()/1024); } } } public void contextDestroyed(ServletContextEvent arg0) { } } |
1.1.3 客户端
<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Comet4J Hello World</title> <script type="text/javascript" src="js/comet4j.js"></script> <script type="text/javascript"> function init(){ var kbDom = document.getElementById('kb'); JS.Engine.on({ hello : function(kb){//侦听一个channel kbDom.innerHTML = kb; } }); JS.Engine.start('conn'); JS.Engine.on( 'start',function(cId,channelList,engine){ alert('连接已建立,连接ID为:' + cId); }); } </script> </head> <body onload="init()"> 剩余内存:<span id="kb">...</span>KB </body> </html> |
1.1.4 运行效果
在浏览器输入:http://IP:8080/Comet4j/helloworld.html,运行效果如下。
从下面的网络请求可以看出,comet4j 通过comet流方式实现服务端信息的推送。