Comet---“服务器推”技术实现
Comet是一种服务器推数据的技术,基于HTTP长链接,避免因链接过多而导致的资源开销。对于智能化监控系统,是一种合适的技术选择。因为监控系统需要实时的把更新的信息推送给客户端。
以下部分引用至IBM官网:
Comet 简介
浏览器作为 Web 应用的前台,自身的处理功能比较有限。浏览器的发展需要客户端升级软件,同时由于客户端浏览器软件的多样性,在某种意义上,也影响了浏览器新技术的推广。在 Web 应用中,浏览器的主要工作是发送请求、解析服务器返回的信息以不同的风格显示。AJAX 是浏览器技术发展的成果,通过在浏览器端发送异步请求,提高了单用户操作的响应性。但 Web 本质上是一个多用户的系统,对任何用户来说,可以认为服务器是另外一个用户。现有 AJAX 技术的发展并不能解决在一个多用户的 Web 应用中,将更新的信息实时传送给客户端,从而用户可能在“过时”的信息下进行操作。而 AJAX 的应用又使后台数据更新更加频繁成为可能。
图 1. 传统的 Web 应用模型与基于 AJAX 的模型之比较
“服务器推”是一种很早就存在的技术,以前在实现上主要是通过客户端的套接口,或是服务器端的远程调用。因为浏览器技术的发展比较缓慢,没有为“服务器推”的实现提供很好的支持,在纯浏览器的应用中很难有一个完善的方案去实现“服务器推”并用于商业程序。最近几年,因为 AJAX 技术的普及,以及把 IFrame 嵌在“htmlfile“的 ActiveX 组件中可以解决 IE 的加载显示问题,一些受欢迎的应用如 meebo,gmail+gtalk 在实现中使用了这些新技术;同时“服务器推”在现实应用中确实存在很多需求。因为这些原因,基于纯浏览器的“服务器推”技术开始受到较多关注,Alex Russell(Dojo Toolkit 的项目 Lead)称这种基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。目前已经出现了一些成熟的 Comet 应用以及各种开源框架;一些 Web 服务器如 Jetty 也在为支持大量并发的长连接进行了很多改进。关于 Comet 技术最新的发展状况请参考关于 Comet 的 wiki。
下面介绍comet的java实现:
设定已经安装了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中配置监听以及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,定义好数据渠道,并传递数据。
如下的案例中,系统设置一个线程,每三秒从内存结构中读取数据。
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页面编写,将数据展示
<%@ 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---“服务器推”技术实现相关推荐
- comet - “服务器推”技术
概念 comet :基于 HTTP 长连接的"服务器推"技术,是一种新的 Web 应用架构.基于这种架构开发的应用中,服务器端会主动以异步的方式向 客户端程序推送数据,而不需要客户 ...
- Comet:基于 HTTP 长连接的“服务器推”技术解析
一.背景介绍 传统web请求,是显式的向服务器发送http Request,拿到Response后显示在浏览器页面上.这种被动的交互方式不能满足对信息实时性要求高的应用,譬如聊天室.股票交易行情.在线 ...
- Comet:基于 HTTP 长连接的“服务器推”技术 (实例)
"服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求.服务器端响应的方式工作.这种方式并不能满足很多现实应用的需求,譬如: 1. 监控系统:后台硬件热插拔.LED.温度 ...
- Comet:基于HTTP长连接的“服务器推”技术
作者:周 婷 (zhouting@cn.ibm.com), 软件工程师, IBM 中国软件开发技术实验室 来源:http://www.ibm.com/developerworks/cn/web/wa- ...
- [转载] Comet:基于 HTTP 长连接的“服务器推”技术
转载自http://www.ibm.com/developerworks/cn/web/wa-lo-comet/ "服务器推"技术的应用 传统模式的 Web 系统以客户端发出请求. ...
- pushlet实现服务器推技术
服务器推技术: (1)由于目前我司电话系统处理来电弹屏存在一个问题,就是客户端登录系统会触发前端js不断去请求数据库数据,并反馈给前端,如果使用者一多,将会导致系统资源高消耗: (2)目前比较成 ...
- 采用PHP实现”服务器推”技术的聊天室
传统的B/S结构的应用程序,都是采用"客户端拉"结束来实现客户端和服务器端的数据交换. 本文将通过结合Ticks(可以参看我的另外一篇文章:关于PHP你可能不知道的-PHP的事件驱 ...
- 基于php和服务器推技术的web即时聊天系统,基于php和服务器推技术的Web即时聊天系统...
基于php和服务器推技术的Web即时聊天系统① 王振兴, 黄静 [摘要]摘要: 基于http协议应用于Web端, 实现一个浏览器无关的.便于移植的.高性能的Web即时聊天系统. 系统使用服务器推技术中 ...
- Pushlet和Dwr的简单服务器推技术
附件里Pushlet和Dwr3.0的简单服务器推技术. DWR-Source.rar为DWR的学习资料. 下面简单介绍一下dwr3.0 RC2版本的反推技术代码. 首先下载dwr官方包,笔者这里下载的 ...
- Comet服务器推送与SignalR
HTTP协议是一个典型的Request/Response协议,是基于TCP/IP之上的一个应用层协议,该协议最典型的特点就是无状态且需要客户端发起Request服务端才能进行Response,这意味着 ...
最新文章
- 讲解SQL2005数据库转到SQL2000的步骤
- oracle建表后添加数据报错:ORA-01658:无法为表空间中的段创建INITIAL区
- 【GPU精粹与Shader编程】(一) 全系列核心知识点总览
- 【翻译】GitHub Pages Basics 基本使用帮助【一】GitHub Pages 是什么?
- Redis数据库学习笔记
- 关于三甲医院转行IT 医生家属说两句
- 解决mac使用svn: E170000: Unrecognized URL scheme for h
- Python面试题解答——第二部分企业面试题
- Win10,Win7,WinServer2012,WinServer2008内存最大支持
- python中day_python day02
- 63%的农村孩子没上高中,中国如何跨越中等收入陷阱?
- 静态语言采用什么方式执行 如c语言,编程语言的两种执行方式
- 运行时异常和非运行时异常(一般异常)的区别
- LabVIEW将现有数据文件映射至TDMS数据文件格式
- 【解决方案】根据当前系统时钟或签名文件中的时间戳验证时要求的证书不在有效期内
- linux常用基础命令整理
- vlunhub之Nagini(详细过程)
- python中文字符串多余空格_[785]python去掉字符串中多余的空格
- 企业怎样实现微信营销?SCRM软件可以做到吗?
- R语言 : 层次聚类分析
热门文章
- 重构碎片化知识_知识碎片化时代,如何妙用思维导图,提高你的学习效率(含福利)...
- 手机鸿蒙公测选择一个应用,鸿蒙系统公测半个月,首批“差评”很难听,但是却也很真实...
- oracle ora-24247 ACL,ORACLE 11G 存储过程发送邮件(job),ORA-24247:网络访问被访问控制列表 (ACL) 拒绝...
- 苹果手机声音突然变小是怎么回事_苹果7通话声音小,苹果7听筒声音小怎么回事...
- matlab 代谢流分析,代谢网络流分析进展及应用-生物在线.PDF
- 【CMD】管道符(|)
- Redis(window版本)
- python包的中 _init _.py文件介绍
- 框架 go_go异步任务框架machinery,嗖嗖的[视频]
- postman下载教程linux,linux 安装postman