Comet---“服务器推”技术实现
Comet是一種服務器推數(shù)據的技術,基于HTTP長鏈接,避免因鏈接過多而導致的資源開銷。對于智能化監(jiān)控系統(tǒng),是一種合適的技術選擇。因為監(jiān)控系統(tǒng)需要實時的把更新的信息推送給客戶端。
以下部分引用至IBM官網:
Comet 簡介
瀏覽器作為 Web 應用的前臺,自身的處理功能比較有限。瀏覽器的發(fā)展需要客戶端升級軟件,同時由于客戶端瀏覽器軟件的多樣性,在某種意義上,也影響了瀏覽器新技術的推廣。在 Web 應用中,瀏覽器的主要工作是發(fā)送請求、解析服務器返回的信息以不同的風格顯示。AJAX 是瀏覽器技術發(fā)展的成果,通過在瀏覽器端發(fā)送異步請求,提高了單用戶操作的響應性。但 Web 本質上是一個多用戶的系統(tǒng),對任何用戶來說,可以認為服務器是另外一個用戶。現(xiàn)有 AJAX 技術的發(fā)展并不能解決在一個多用戶的 Web 應用中,將更新的信息實時傳送給客戶端,從而用戶可能在“過時”的信息下進行操作。而 AJAX 的應用又使后臺數(shù)據更新更加頻繁成為可能。
圖 1. 傳統(tǒng)的 Web 應用模型與基于 AJAX 的模型之比較
“服務器推”是一種很早就存在的技術,以前在實現(xiàn)上主要是通過客戶端的套接口,或是服務器端的遠程調用。因為瀏覽器技術的發(fā)展比較緩慢,沒有為“服務器推”的實現(xiàn)提供很好的支持,在純?yōu)g覽器的應用中很難有一個完善的方案去實現(xiàn)“服務器推”并用于商業(yè)程序。最近幾年,因為 AJAX 技術的普及,以及把 IFrame 嵌在“htmlfile“的 ActiveX 組件中可以解決 IE 的加載顯示問題,一些受歡迎的應用如 meebo,gmail+gtalk 在實現(xiàn)中使用了這些新技術;同時“服務器推”在現(xiàn)實應用中確實存在很多需求。因為這些原因,基于純?yōu)g覽器的“服務器推”技術開始受到較多關注,Alex Russell(Dojo Toolkit 的項目 Lead)稱這種基于 HTTP 長連接、無須在瀏覽器端安裝插件的“服務器推”技術為“Comet”。目前已經出現(xiàn)了一些成熟的 Comet 應用以及各種開源框架;一些 Web 服務器如 Jetty 也在為支持大量并發(fā)的長連接進行了很多改進。關于 Comet 技術最新的發(fā)展狀況請參考關于 Comet 的 wiki。
下面介紹comet的java實現(xiàn):
設定已經安裝了TOMCAT7.0以及Eclipse,
- 下載comet4j-tomcat7.jar以及comet4j.js,放置于工程對應目錄
- 修改tomcat的server.xml配置,改為使用nio.
<Connector URIEncoding="UTF-8" connectionTimeout="20000"
port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
- 在應用工程的web.xml中配置監(jiān)聽以及comet連接地址
<listener>
<listener-class>org.comet4j.core.CometAppListener</listener-class>
</listener>
<listener>
<description>ComnetListener</description>
<listener-class>comet.ComnetListener</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>
4. 服務端代碼編寫,這里我們需要編寫一個ServletContextListener,定義好數(shù)據渠道,并傳遞數(shù)據。
如下的案例中,系統(tǒng)設置一個線程,每三秒從內存結構中讀取數(shù)據。
import java.util.ArrayList;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import monitorlogic.MonitorUser;
import org.comet4j.core.CometContext;
import org.comet4j.core.CometEngine;
?
public class ComnetListener implements ServletContextListener {
????? private static final String CHANNEL1 = "num";
public void contextInitialized(ServletContextEvent arg0) {
CometContext cc = CometContext.getInstance();
cc.registChannel(CHANNEL1);
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);
}
catch (Exception ex)
{
ex.printStackTrace();
}
CometEngine engine = CometContext.getInstance().getEngine();
StringBuffer htmlResult = new StringBuffer();
????? ?ArrayList<Integer> al = MonitorUser.getUserList();
?????????? int sum = 0;
?????????? for (int i=0;i<al.size();i++)
?????????? {
???????????????? sum = sum +al.get(i);
?????????? }
?????????? int span = al.size()+1;
?????????????????????????????????
?????????? engine.sendToAll(CHANNEL1, sum);
}
}
}
public void contextDestroyed(ServletContextEvent arg0)
{
?????
}
}
5. web頁面編寫,將數(shù)據展示
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Insert title here</title>
<script type="text/javascript" src="js/comet4j.js"></script>
<script type="text/javascript">
function init(){
var kbDom = document.getElementById('bb');
JS.Engine.on({
num : function(bb){//偵聽一個channel
kbDom.innerHTML = bb;
}
????? });
JS.Engine.start('conn');
JS.Engine.on(
'start',function(cId,channelList,engine){
alert('連接已建立,連接ID為:' + cId);
});
}
</script>
</head>
<body οnlοad="init()">
????? <h2>今日總計:<FONT color=red id="bb"></FONT>個</h2>
</body>
</html>
?
如果您認可本文,就點擊下圖的二維碼關注本訂閱號。長按下圖的二維碼,然后點擊“識別圖中的二維碼”。
總結
以上是生活随笔為你收集整理的Comet---“服务器推”技术实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 针对B2B平台的接口自动化测试系统
- 下一篇: 【Erlang应用】消息队列Rabbit