本文主要介绍Comet以及其实现原理
Comet介绍
理解Comet之前,首先我们要知道什么是“服务器推”,“服务器推”是一个很早就存在的技术,其原理为:将后台发生的变化实时传送到客户端,由服务器发起通信,并向客户端发送数据。 那么, 基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术称为“Comet”。 目前已经出现了一些成熟的 Comet 应用以及各种开源框架;一些 Web 服务器如Jetty 也在为支持大量并发的长连接进行了很多改进。
Comet应用
通用:即时通讯、实时监控、即时报价等
seas中应用:消息提醒、进度显示、在线沟通
Comet实现技术
1、基于 Iframe 及 htmlfile 的流(streaming)方式
工作原理:
HTML 页面里嵌入一个隐蔵帧 iframe,将其SRC设为长连接,每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭。
工作时序图:
应用:
SEAS进度条
gmail+gtalk
注:使用 iframe 请求一个长连接有一个很明显的不足之处:IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法用到了 gmail+gtalk 产品中。Alex Russell 在 “What else is burried down in the depth's of Google's amazing JavaScript?”文章中介绍了这种方法。Zeitoun 网站提供的 comet-iframe.tar.gz,封装了一个基于 iframe 和 htmlfile 的 JavaScript comet 对象,支持 IE、Mozilla Firefox 浏览器,可以作为参考。
2、基于 AJAX 的长轮询(long-polling)方式
工作原理:
使用AJAX发送请求,服务器端会阻塞请求直到有数据传递或超时才返回客户端处理完服务器返回的信息后,再次发出请求
工作时序图:
注:目前IE 不支持基于 Streaming AJAX。
总结
本文介绍了Comet的两种实现技术,如何开发一个Comet应用,还需要根据应用本身的需求考虑更多的细节,如:不要在同一客户端同时使用超过两个的 HTTP 长连接、服务器端的性能和可扩展性、在客户和服务器之间保持“心跳”信息等。相对于传统的 Web 应用, 目前开发 Comet 应用还是具有一定的挑战性。“服务器推”存在广泛的应用需求,最近几年,无论是服务器还是浏览器都出现了很多新技术,同时也出现了很多开源的 Comet 框架、协议。需求推动技术的发展,相信 Comet 的应用会变得和 AJAX 一样普及。
关于 Comet 技术最新的发展状况请参考关于 Comet 的 wiki。