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流方式實現服務端信息的推送。