HTTP长连接的“服务器推”技术
很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户 端而无须客户端不停地刷新、发送请求。本文首先介绍、比较了常用的服务器推方案,着重介绍了 Comet 使用 HTTP 长连接、无须浏览器安装插件的两种服务器推方案:基于 AJAX 的长轮询方式;基于 iframe htmlfile 的流方式。最后分析了开发 Comet 应用需要注意的一些问题,以及如何借助开源的 Comet 框架-pushlet 构建自己的服务器推应用。
服务器推技术的应用
传统模式的 Web 系统以客户端发出请求、服务器端响应的方式工作。这种方式并不能满足很多现实应用的需求,譬如:
监控系统:后台硬件热插拔、LED、温度、电压发生变化;
即时通信系统:其它用户登录、发送信息;
即时报价系统:后台数据库内容发生变化;
这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。服务器推技术在现实应用中有一些解决方案,本文将这些解决方案 分为两类:一类需要在浏览器端安装插件,基于套接口传送信息,或是使用 RMICORBA 进行远程调用;而另一类则无须浏览器安装任何插件、基于 HTTP 长连接。
服务器推应用在 Web 程序中,首先考虑的是如何在功能有限的浏览器端接收、处理信息:
1. 客户端如何接收、处理信息,是否需要使用套接口或是使用远程调用。客户端呈现给用户的是 HTML 页面还是 Java applet Flash 窗口。如果使用套接口和远程调用,怎么和 JavaScript 结合修改 HTML 的显示。
2. 客户与服务器端通信的信息格式,采取怎样的出错处理机制。
僵尸围城怎么做3. 客户端是否需要支持不同类型的浏览器如 IEFirefox,是否需要同时支持 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 提供的接口,我们可以参考 AFLAXAsynchronous 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,通过 java.Socket java.DatagramSocket java.MulticastSocket 建立与服务器端的套接口连接,从而实现服务器推
这种方案最大的不足在于 Java applet 在收到服务器端返回的信息后,无法通过范冰冰最新婚纱照 JavaScrip
t 去更新 HTML 页面的内容。
基于 HTTP 长连接的服务器推技术
Comet 简介
浏览器作为 Web 应用的前台,自身的处理功能比较有限。浏览器的发展需要客户端升级软件,同时由于客户端浏览器软件的多样性,在某种意义上,也影响了浏览器新技术的推广。 Web 应用中,浏览器的主要工作是发送请求、解析服务器返回的信息以不同的风格显示。AJAX 是浏览器技术发展的成果,通过在浏览器端发送异步请求,提高了单用户操作的响应性。但 Web 本质上是一个多用户的系统,对任何用户来说,可以认为服务器是另外一个用户。现有 AJAX 技术的发展并不能解决在一个多用户的 Web 应用中,将更新的信息实时传送给客户端,从而用户可能在过时的信息下进行操作。而 AJAX 的应用又使后台数据更新更加频繁成为可能。

1. 传统的 Web 应用模型与基于 AJAX 的模型之比较
服务器推是一种很早就存在的技术,以前在实现上主要是通过客户端的套接口,或是服 务器端的远程调用。因为浏览器技术的发展比较缓慢,没有为服务器推的实现提供很好的支持,在纯浏览器的应用中很难有一个完善的方案去实现服务器推 并用于商业程序。最近几年,因为 AJAX 技术的普及,以及把 IFrame 嵌在关晓彤旗袍造型曝光htmlfile“的 ActiveX 组件中可以解决 IE 的加载显示问题,一些受欢迎的应用如 meebogmail+gtalk 在实现中使用了这些新技术;同时服务器推在现实应用中确实存在很多需求。因为这些原因,基于纯浏览器的服务器推技术开始受到较多关注,Alex RussellDojo Toolkit 的项目 Lead)称这种基于 HTTP 长连接、无须在浏览器端安装插件的服务器推技术为Comet”。目前已经出现了一些成熟的 Comet 应用以及各种开源框架;一些 Web 服务器如 Jetty 也在为支持大量并发的长连接进行了很多改进。关于 Comet 技术最新的发展状况请参考关于 Comet wiki
下面将介绍两种 Comet 应用的实现模型。
基于 AJAX 的长轮询(long-polling)方式
如图1所示,AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行更新。使用 AJAX 实现服务器推与传统的 AJAX 应用不同之处在于
1. 服务器端会阻塞请求直到有数据传递或超时才返回。
2. 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
3. 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。

2. 基于长轮询的服务器推模型整数包括什么
一些应用及示例如 Meebo, Pushlet Chat 都采用了这种长轮询的方式。相对于轮询poll),这种长轮询方式也可以称为pull)。因为这种方案基于 AJAX,具有以下一些优点:请求异步发出;无须安装插件;IEMozilla FireFox 都支持 AJAX
在这种长轮询方式下,客户端是在 XMLHttpRequest readystate 4(即数据传输结束)时调用回调函数,进行信息处理。当 readystate 4 时,数据传输结束,连接已经关闭。Mozilla Firefox 提供了对 Streaming AJAX 的支持, readystate 3 时(数据仍在传输中),客户端可以读取数据,从而无须关闭连接,就能读取处理服务器端返回的信息。IE readystate 3 时,不能读取服务器返回的数据,目前 IE 不支持基于 Streaming AJAX
基于 Iframe htmlfile 的流(streaming)方式
iframe 是很早就存在的一种 HTML 标记, 通过在 HTML 页面里嵌入一个隐蔵帧,然后将这个隐蔵帧的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。

3. 基于流方式的服务器推模型
上节提到的 AJAX 方案是在 JavaScript 里处理 XMLHttpRequest 从服务器取回的数据,然后 Javascript 可以很方便的去控制 HTML 页面的显示。同样的思路用在 iframe 方案的客户端,iframe 服务器端并不返回直接显示在页面的数据,而是返回对客户端 Javascript
数的调用,如 。服务器端将返回的数据作为客户端 JavaScript 函数的参数传递;客户端浏览器的 Javascript 引擎在收到服务器返回的 JavaScript 调用时就会去执行代码。
从图3可以看到,每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接, 服务器端可以设置一个超时时间,昵称大全2020 超时后通知客户端重新建立连接,并关闭原来的连接)。
使用 iframe 请求一个长连接有一个很明显的不足之处:IEMorzilla 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 网站提供的 ,封装了一个基于 iframe htmlfile JavaScript comet 对象,支持 IEMozilla Firefox 浏览器,可以作为参考。