Comet: ajax server push

ajax, java No Comments »

1、什么是Comet?

了解Comet首先说明一下服务器推技术,由于受HTTP协议天生的缺陷——无状态,客户端无法像基于Socket的C/S程序一样实现监听,只能是客户端主动发出请求,服务器应答。而服务器不能及时把数据主动返回给客户端。为了解决这个问题Philip McCarthy提出了Comet这种技术解决方案。在文章中作者把这种通过长链接,服务器端及时推送数据给客户端,即文中的Low Latency Data for the Browser(针对浏览器低潜伏期数据)的技术称为Comet。

它可应用于一些对数据及时性要求较高的系统性

  • 监控系统:后台硬件热插拔、LED、温度、电压发生变化;
  • 即时通信系统:其它用户登录、发送信息;
  • 即时报价系统:后台数据库内容发生变化;
  • 最近比较热门的Web游戏等式

2、分析Comet

首先针对在B/S中上能实现类似功能的技术进行一下介绍:

a、Flash+Javascript:由于Flash能使用XMLSocket,且Javascript可以调用它的接口与服务器端的套接口进行通信。

b、Java Applet:Java小程序,相当于页面中的Java程序,使用Socket和服务器通信当然也是没问题的。

c、Ajax Poll:通过轮询循环对服务器发请求,根据服务器应答判断是否数据变动。

d、Comet:建立长连接,服务器及时推送数据。其中又分为Ajax长轮询和iframe流方式。

接下来我们对这几种技术进行一个对比

Flash+Javascript JavaApplet Ajax Poll Comet
协议类型 Socket HTTP
支持环境[1] 安装Flash Player插件 安装JRE
端口限制 非80端口,受系统及防火墙限制 80端口,基本无限制
线程限制 受系统可用端口数限制 受浏览器线程限制,IE默认同一域最大线程为2,所以然推荐长连接线程最好不超过1个
其它 无法自动穿墙面 JS无法使用JavaApplet返回的结果来更新HTML 非长轮询,由于为定时请求,不能判断服务器端是否有更新,频繁请求,返回过多无用应答,浪费服务器资源。受轮询间隔时间限制,可能影响数据的及时性。 长时间占用服务器线程(已有针对该方案的服务器端解决方式,如Jetty6容器,最新的Tomcat6也进行了优化),使用iframe流方式时浏览器进度显示为一直在加载。(Google工程师已有解决IE加载问题的对应ActiveX)

[1]除JavaApplet外都需要浏览器中对JS的支持。

3、实现Comet
开源pushlet框架、DWR2使用Dojo与容器Jetty6/Tomcat6结合,具体实现见下面参考文档

4、Comet实例

5、参考文档
Comet:基于 HTTP 长连接的“服务器推”技术

Ajax for Java developers: Write scalable Comet applications with Jetty and Direct Web Remoting中文

Tomcat 6 -Advanced IO and Tomcat6

前两篇IBM技术文章后面也有大量参考资料

  • Share/Bookmark
WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in