Comet:基于 HTTP 长连接的“服务器推”技术

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Comet:基于HTTP 长连接的“服务器推”技术

很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的“服务器推”方案,着重介绍了Comet -使用HTTP 长连接、无须浏览器安装插件的两种“服务器推”方案:基于AJAX 的长轮询方式;基于iframe 及htmlfile 的流方式。最后分析了开发Comet 应用需要注意的一些问题,以及如何借助开源的Comet 框架-pushlet 构建自己的“服务器推”应用。

“服务器推”技术的应用

传统模式的Web 系统以客户端发出请求、服务器端响应的方式工作。这种方式并不能满足很多现实应用的需求,譬如:

∙监控系统:后台硬件热插拔、LED、温度、电压发生变化;

∙即时通信系统:其它用户登录、发送信息;

∙即时报价系统:后台数据库内容发生变化;

这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。“服务器推”技术在现实应用中有一些解决方案,本文将这些解决方案分为两类:一类需要在浏览器端安装插件,基于套接口传送信息,或是使用RMI、CORBA 进行远程调用;而另一类则无须浏览器安装任何插件、基于HTTP 长连接。

将“服务器推”应用在Web 程序中,首先考虑的是如何在功能有限的浏览器端接收、处理信息:

1.客户端如何接收、处理信息,是否需要使用套接口或是使用远程调用。客户端呈现给用户的是HTML 页面还是Java applet 或

Flash 窗口。如果使用套接口和远程调用,怎么和JavaScript 结合修改HTML 的显示。

2.客户与服务器端通信的信息格式,采取怎样的出错处理机制。

3.客户端是否需要支持不同类型的浏览器如IE、Firefox,是否需要同时支持Windows 和Linux 平台。

基于客户端套接口的“服务器推”技术

Flash XMLSocket

如果Web 应用的用户接受应用只有在安装了Flash 播放器才能正常运行,那么使用Flash 的XMLSocket 也是一个可行的方案。这种方案实现的基础是:

1.Flash 提供了XMLSocket 类。

2.JavaScript 和Flash 的紧密结合:在JavaScript 可以直接调用Flash 程序提供的接口。

具体实现方法:在HTML 页面中内嵌入一个使用了XMLSocket 类的Flash 程序。JavaScript 通过调用此Flash 程序提供的套接口接口与服务器端的套接口进行通信。JavaScript 在收到服务器端以XML 格式传送的信息后可以很容易地控制HTML 页面的内容显示。

关于如何去构建充当了JavaScript 与Flash XMLSocket 桥梁的Flash 程序,以及如何在JavaScript 里调用Flash 提供的接口,我们可以参考AFLAX(Asynchronous Flash and XML)项目提供的Socket Demo 以及SocketJS(请参见参考资源)。

Javascript 与Flash 的紧密结合,极大增强了客户端的处理能力。从Flash 播放器V7.0.19 开始,已经取消了XMLSocket 的端口必须大于1023 的限制。Linux 平台也支持Flash XMLSocket 方案。但此方案的缺点在于:

1.客户端必须安装Flash 播放器;

2.因为XMLSocket 没有HTTP 隧道功能,XMLSocket 类不能自动穿过防火墙;

3.因为是使用套接口,需要设置一个通信端口,防火墙、代理服务器也可能对非HTTP 通道端口进行限制;

不过这种方案在一些网络聊天室,网络互动游戏中已得到广泛使用。

Java Applet 套接口

在客户端使用Java Applet,通

过.Socket或.DatagramSocket或.MulticastSocket建立与服务器端的套接口连接,从而实现“服务器推”。

这种方案最大的不足在于Java applet 在收到服务器端返回的信息后,无法通过JavaScript 去更新HTML 页面的内容。

基于HTTP 长连接的“服务器推”技术

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 应用的实现模型。

基于AJAX 的长轮询(long-polling)方式

相关文档
最新文档