一. 什么是COMET ?
查阅词典Comet中文是“彗星”的意思,起初我见到这个单词的时候,我就猜想优美名字背后到底是什么呢?他是一种WEB服务器推的应用技术(Server Push)。Server Push就如同它自己的名字一样,将更多华丽的web体验“推”进了我们的视野。有一些观点将Comet比作是 Ajax 的接班人,这个观点 我无法苟同,我认为Ajax 与Comet 并不存在取代关系。从实质上讲 Comet 还是Ajax的应用。
要讲清楚Comet是什么的问题?我不妨将话题扯远点,我们先了解下web开发的历史。大家一定还记得从前,我们在论坛注册账号,一点了提交按钮,页面就一片空白(服务器在刷新页面,处理提交数据),ie的状态图就不停的转,一个提交按钮一点,页面就再也不能进行其他操作了(因为这里的数据请求和界面操作是同步的)。我们就傻等着服务器处理完数据后返回,以前网速也慢,服务器性能也差。那么这个等待时间就会挑战大家的容忍极限。这个就是Ajax诞生要解决的问题。
其实在Ajax这个名字没有出现的时候,‘Ajax’的应用就已经存在了。那时前辈们就已经在WEB方面为追求更完美的用户体验,为追求异步通信,为追求局部刷新摸索出了一些可重用的方式方法。大致方法有2种:
一种是页面中放入一个隐藏的frame 页面,这个页面有一个表单form对象。而数据的提交,就交给这个 frame 页面。就算是刷新也是这个页面刷新,而这个页面由于是隐藏的或者高度和宽度设置为0的,所以刷新时候用户感觉不到。那么当数据返回的时候也就能够达到局部刷新的效果。而且用户操作的页面不用被卡住,这样也达到异步通信的效果了。这种是比较古老和麻烦的方法。
另外一种和当今的Ajax就很类似了。开发人员开发自己的ActiveX 控件,这个控件的功能基本和现在Ajax 差不多,其实Ajax 大家也可以看成是一个ActiveX 控件,只是各大浏览器都实现了这个ActiveX 控件。所以现在我们开发Ajax应用,不用自己开发这个ActiveX 控件。
Ajax实现了对XMLHTTP对象的封装,这个对象有一系列接口,比较重要的是发送异步数据的接口。
二. Comet是在什么历史背景下诞生的呢?
当服务器端数据发生变化时,客户端如何即时得到通知呢?这个就是Comet诞生的背景。
1. 传统方法定时刷新,就是隔一个时间段浏览器刷新一次。(没有用户受得了这种方法,服务器也害怕遇到这种事情)
2. 长轮询(long-polling)Ajax隔一段时间就去服务器查询是否有更新,但是多长时间去查询成了问题。因为性能和即时性造成了严重的反比关系。
3. 在前面两种方法被否定后,想到了服务器推送至客户端这种模式,但是web开发客户端是一个浏览器(并不是我们自己控制的GUI客户端)。所以Comet登场,简单说还是利用Ajax与服务器建立http长连接查询是否有数据更新,服务器收到一个连接如果没有数据更新就阻塞这个连接不要返回给客户端,直到有新数据再返回给客户端。Web客户端,发起的连接一旦被返回,或者超时就再次建立http长连接。这样就能保证数据的即时更新,以及尽量减少服务器的计算工作。
三. Comet的一些应用
目前Comet主要应用在一些股票web客户端,以及一些基于web的即时聊天系统中。 比较成熟的框架有Dojo ,Dwr 等一些Ajax框架中实现了该功能。
四. Comet 优、 缺点
4.1 缺点
长期占用连接,丧失了无状态高并发的特点。server push不会是一个没有副作用的解决方案,是否适合还要仔细权衡。
4.2 优点
Ø 实时性好(消息延时小)
Ø 性能好(能支持大量用户)
五. 其他服务器推技术
Comet 只是众多服务器推技术中的一种,目前市面上还有许多其他流行服务器推技术。
5.1 Flash XMLSocket,这种方案实现的基础是:
1. Flash 提供了 XMLSocket 类。
2. JavaScript 和 Flash 的紧密结合:在 JavaScript 可以直接调用 Flash 程序提供的接口。
但此方案的缺点在于:
1. 因为 XMLSocket 没有 HTTP 隧道功能,XMLSocket 类不能自动穿过防火墙;
2. 因为是使用套接口,需要设置一个通信端口,防火墙、代理服务器也可能对非 HTTP 通道端口进行限制;
不过这种方案在一些网络聊天室,网络互动游戏中已得到广泛使用。
5.2 Java Applet 套接口
在客户端使用 Java Applet,通过 java.net.Socket 或 java.net.DatagramSocket 或 java.net.MulticastSocket 建立与服务器端的套接口连接,从而实现“服务器推”。这种方案最大的不足在于 Java applet 需要客户端安装JAVA虚拟机。
总结
Comet 不存在什么新技术,没有什么神秘可言。瓶颈主要集中在web server这一块,一般成熟的Comet商业应用都会有一套它自己专用的web server,比如lightstreamer就是这样!
实例解析:
服务端:
<?php
$filename = dirname(__FILE__).'/data.txt';
$msg = isset($_GET['msg']) ? $_GET['msg'] : '';
if ($msg != '')
{
//写入内容至文件
file_put_contents($filename,$msg);
die();
}
set_time_limit(0);
$lastmodif = isset($_GET['timestamp']) ? $_GET['timestamp'] : 0;
//取得文件最后修改时间
$currentmodif = filemtime($filename);
while ($currentmodif <= $lastmodif)
{
//有释放CPU占用率的作用
usleep(10000);
//清除文件缓存信息
clearstatcache();
$currentmodif = filemtime($filename);
}
// return a json array
$response = array();
$response['msg'] = file_get_contents($filename);
$response['timestamp'] = $currentmodif;
echo json_encode($response);
ob_flush();
flush();
?>
客户端:
onComplete: function(transport)
{
if (!WebApp._noerror_)
{
setTimeout(WebApp.WebMain, 5000);
}else{
setTimeout(WebApp.WebMain, 10);
}
WebApp._noerror_ = false;
}
可以看到不管成功失败都将开始一次新的ajax请求。也就是保持了连接。
使用方法:
1.需要php服务器;
2.开两个不同浏览器即可掩饰效果。
这只是一个介绍原理型demo,请勿商业使用。
【转自:http://www.blogjava.net 原作者:JAVA-HE】
分享到:
相关推荐
在"web推送 Comet技术"的项目中,我们使用了Tomcat7作为服务器环境。Tomcat是一个流行的开源Java Servlet容器,支持Java EE的Web应用程序。配置Tomcat7以支持Comet技术,通常需要修改服务器的配置文件,如`server....
【气泡提示与Comet技术】 在Web开发中,实现即时通信(Real-Time Communication)是一项重要的功能,尤其在社交应用和消息通知系统中。传统的HTTP协议是基于请求-响应模型的,即客户端发起请求,服务器返回响应,...
1. **Comet技术的工作原理** - **Long Polling**:客户端发起一个HTTP请求,服务器接收到请求后不立即返回,而是保持连接打开状态,直到有新的数据可发送时才将数据返回给客户端,并关闭连接。客户端在收到响应后...
Comet技术的核心目标是解决Web应用中的实时性问题,如股票报价、聊天室、在线游戏等场景,需要即时更新信息。由于HTTP协议本身的限制,Comet采用了两种主要的实现策略:长轮询(Long-Polling)和流(Streaming)。 ...
浅析Comet技术在Java Web实时系统开发中的应用 Comet技术是Java Web实时系统开发中的关键技术之一,它通过实现服务器推送(Server Push)来解决AJAX需要定时频繁发送请求的问题。Comet技术有两种实现方式:长轮询...
AJAX(Asynchronous JavaScript and XML)是Comet技术出现之前的一种常见解决方案,它允许Web页面在不刷新整个页面的情况下与服务器进行异步通信。AJAX通过XMLHttpRequest对象实现局部更新,提高了用户体验,但仍然...
这个"comet demo"是一个展示如何在Java环境下利用Tomcat服务器实现Comet技术的实例。Tomcat 6.0是Apache软件基金会开发的开源Servlet容器,支持各种Java Web应用的部署,包括Comet技术。 首先,Comet的核心在于保持...
在提供的文件列表中,"telephone.mp3"可能是一个与Comet技术无关的音频文件,可能是博主在讨论实时通信场景时引用的示例,例如在实时通话应用中,Comet技术可以用来实现语音数据的即时传输。然而,由于具体上下文...
QM Comet技术实现的在线简单即时通讯工具是一种基于Comet技术的Web即时通信解决方案。Comet是一种Web开发技术,它允许服务器向客户端推送数据,而不仅仅是响应客户端的请求,从而实现双向通信,使得实时性得到显著...
Comet4j是一个Java库,专门用于实现Comet技术,这是一种服务器向客户端推送数据的Web应用程序设计模式。Comet技术打破了传统的HTTP请求-响应模型,允许服务器在客户端保持持久连接,从而实现实时数据更新。这在需要...
"Comet Demo" 是一个展示Comet技术实际应用的示例项目,用户可以下载并运行来体验其功能。 在描述中提到,"Comet下载既可以运行",这意味着这个Demo是可执行的,用户下载后无需额外的构建或配置步骤,可以直接启动...
为了实现Web即时通讯(Web Real-Time Communication),开发者引入了Comet技术。Comet是一种使服务器能够主动向客户端推送数据的技术,通过保持一个长期的HTTP连接,使得服务器可以在需要时即时地将数据推送到客户端...
总结起来,Ajax技术利用XMLHttpRequest对象实现了页面局部更新,提高了用户体验,而Comet技术则进一步突破了传统的客户端-服务器通信模式,实现了服务器向客户端的实时数据推送。两者结合使用,可以构建出更加高效、...
5. 兼容性测试:不同浏览器对Comet技术的支持程度不同,确保应用能在主流浏览器上正常工作。 总之,Comet4j提供了一种强大的工具,让Java开发者能够构建实时交互的Web应用。通过正确地集成和使用这个框架,可以极大...
这个包旨在帮助开发者构建基于Comet技术的应用,以提供高效的、双向的服务器到客户端的数据传输。 【描述】提到的几个关键文件如下: 1. `comet4j.js`:这是一个JavaScript库,通常用于客户端,它提供了与comet4j...
【Catalina-Comet.jar】是Apache Tomcat服务器中用于支持Comet技术的一个关键组件。Comet是一种在Web开发中实现服务器推送技术的方法,它允许服务器主动向客户端发送数据,而不仅仅是响应客户端的请求。这种技术对于...
标题"asp.net comet例子"指的是一个展示如何在ASP.NET环境中实现Comet技术的实际示例。这个例子可能包含了一个服务端页面(Service.aspx和服务.aspx.cs),以及一个客户端的HTML页面(ajax.html)。服务端页面处理与...
在本"Comet框架例子项目"中,我们可以深入理解并学习如何利用Comet技术构建实时通信的应用。 Comet的核心理念是通过长时间保持一个HTTP连接来实现服务器到客户端的数据推送,而不是每次有新数据时都创建新的连接。...
通过comet实现了一个聊天功能。 1.需要在tomcat的server.xml里面配置 connectionTimeout="20000" redirectPort="8443" /> 2.需要在tomcat的context.xml里面配置 在Context标签里面配置: ...