`
ralphr
  • 浏览: 142942 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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

    博客分类:
  • web
阅读更多

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

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

   1. 客户端如何接收、处理信息,是否需要使用套接口或是使用远程调用。客户端呈现给用户的是 HTML 页面还是 Java applet 或 Flash 窗口。如果使用套接口和远程调用,怎么和 JavaScript 结合修改 HTML 的显示。
   2. 客户与服务器端通信的信息格式,采取怎样的出错处理机制。
   3. 客户端是否需要支持不同类型的浏览器如 IE、Firefox,是否需要同时支持 Windows 和 Linux 教ā?

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

Flash XMLSocket

这种方案实现的基础是:

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

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

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

   1. 客户端必须安装 Flash 播放器;
   2. 因为 XMLSocket 没有 HTTP 隧道功能,XMLSocket 类不能自动穿过防火墙;
   3. 因为是使用套接口,需要设置一个通信端口,防火墙、代理服务器也可能对非 HTTP 通道端口进行限制;

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

Java Applet 套接口


在客户端使用 Java Applet,通过 java.net.Socket 或 java.net.DatagramSocket 或 java.net.MulticastSocket 建立与服务器端的套接口连接,从而实现“服务器推”。

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


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

Comet 简介
下面将介绍两种 Comet 应用的实现模型。
基于 AJAX 的长轮询(long-polling)方式
AJAX 的出现使得 JavaScript 可以调用 XMLHttpRequest 对象发出 HTTP 请求,JavaScript 响应处理函数根据服务器返回的信息对 HTML 页面的显示进行更新。使用 AJAX 实现“服务器推”与传统的 AJAX 应用不同之处在于:

   1. 服务器端会阻塞请求直到有数据传递或超时才返回。
   2. 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
   3. 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。
因为这种方案基于 AJAX,具有以下一些优点:请求异步发出;无须安装插件;IE、Mozilla FireFox 都支持 AJAX。
Mozilla Firefox 提供了对 Streaming AJAX 的支持, 即 readystate 为 3 时(数据仍在传输中),客户端可以读取数据,从而无须关闭连接,就能读取处理服务器端返回的信息。IE 在 readystate 为 3 时,不能读取服务器返回的数据,目前 IE 不支持基于 Streaming AJAX。


基于 Iframe 及 htmlfile 的流(streaming)方式
通过在 HTML 页面里嵌入一个隐蔵帧,然后将这个隐蔵帧的 SRC 属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。
每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接, 服务器端可以设置一个超时时间, 超时后通知客户端重新建立连接,并关闭原来的连接)。
用 iframe 请求一个长连接有一个很明显的不足之处:IE、Morzilla Firefox 下端的进度栏都会显示加载没有完成,而且 IE 上方的图标会不停的转动,表示加载正在进行。Google 的天才们使用一个称为“htmlfile”的 ActiveX 解决了在 IE 中的加载显示问题,并将这种方法用到了 gmail+gtalk 产品中。


使用 Comet 模型开发自己的应用

上面介绍了两种基于 HTTP 长连接的“服务器推”架构,更多描述了客户端处理长连接的技术。对于一个实际的应用而言,系统的稳定性和性能是非常重要的。将 HTTP 长连接用于实际应用,很多细节需要考虑。

不要在同一客户端同时使用超过两个的 HTTP 长连接
HTTP 1.1 规范中规定,客户端不应该与服务器端建立超过两个的 HTTP 连接, 新的连接会被阻塞。

服务器端的性能和可扩展性
但是 AJAX 的应用使请求的出现变得频繁,而 Comet 则会长时间占用一个连接,上述的服务器模型会变得非常低效,甚至可能会阻塞新的连接。

控制信息与数据信息使用不同的 HTTP 连接
使用长连接时,存在一个很常见的场景:客户端网页需要关闭,而服务器端还处在读取数据的堵塞状态,客户端需要及时通知服务器端关闭数据连接。服务器在收到关闭请求后首先要从读取数据的阻塞状态唤醒,然后释放为这个客户端分配的资源,再关闭连接。
所以在设计上,我们需要使客户端的控制请求和数据请求使用不同的 HTTP 连接,才能使控制请求不会被阻塞。
在客户和服务器之间保持“心跳”信息
在浏览器与服务器之间维持一个长连接会为通信带来一些不确定性:因为数据传输是随机的,客户端不知道何时服务器才有数据传送。服务器端需要确保当客户端不再工作时,释放为这个客户端分配的资源,防止内存泄漏。因此需要一种机制使双方知道大家都在正常运行。在实现上:
   1. 服务器端在阻塞读时会设置一个时限,超时后调用会返回,同时发给客户端没有新数据到达的心跳信息。
   2. 经过某个时限没有收到客户端的再次请求,会认为客户端不能正常工作,会释放资源。
   3. 当服务器出现异常,需要通知客户端,同时释放资源。

Pushlet - 开源 Comet 框架
Pushlet 是一个开源的 Comet 框架,在设计上有很多值得借鉴的地方,对于开发轻量级的 Comet 应用很有参考价值。

观察者模型
Pushlet 使用了观察者模型:客户端发送请求,订阅感兴趣的事件;服务器端为每个客户端分配一个会话 ID 作为标记,事件源会把新产生的事件以多播的方式发送到订阅者的事件队列里。

客户端 JavaScript 库

pushlet 提供了基于 AJAX 的 JavaScript 库文件用于实现长轮询方式的“服务器推”;还提供了基于 iframe 的 JavaScript 库文件用于实现流方式的“服务器推”。

分享到:
评论

相关推荐

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

    NULL 博文链接:https://justcoding.iteye.com/blog/1497445

    Comet:基于HTTP长连接的“服务器推”技术[收集].pdf

    【Comet技术详解:HTTP长连接的服务器推送】 在软件开发领域,尤其是在Web应用程序的设计中,"服务器推"技术已经成为解决实时数据传输需求的关键。传统的Web系统采用客户端发起请求、服务器响应的方式工作,但这并...

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

    ### Comet:基于_HTTP_长连接的“服务器推”技术 #### 概述 Comet是一种新兴的技术,它允许服务器向客户端推送数据,而非传统的客户端定时请求数据的方式。这种技术特别适用于那些需要实时更新数据的应用场景,...

    CometAsync_net:C#实现基于http长连接“服务器推”-Comet技术

    C#实现基于http长连接“服务器推”-Comet技术 很多应用譬如监控、即时通信、即时报价系统都需要将后台发生的变化实时传送到客户端而无须客户端不停地刷新、发送请求。 本项目基于 AJAX 的长轮询方式实现。 ...

    CSharp HTTP长连接(Comet)

    在IT行业中,HTTP长连接(也称为Comet技术)是一种用于实现服务器向客户端实时推送数据的方法,常用于构建实时交互的应用,如聊天室、股票报价、在线游戏等。C#作为.NET框架的主要编程语言,提供了丰富的工具和技术...

    Java 实现 Comet 长连接,服务器主动发送消息给客户端

    Java 实现 Comet 长连接,服务器主动发送消息给客户端是一项关键的技术,它在实时通信、推送服务等领域有着广泛的应用。Comet 是一种基于 HTTP 的持久化连接技术,允许服务器在客户端保持一个打开的 HTTP 连接,直到...

    Tomcat comet 服务器推技术

    Tomcat 的 Comet 技术是一种基于 HTTP 长连接的服务器推送技术,允许服务器在客户端保持一个开放的 HTTP 连接,从而能够在数据准备好时立即推送到客户端,而无需客户端发起新的请求。这种技术在实时性要求高的场景,...

    comet demo 向客户端推送例子

    Comet技术是一种基于HTTP长连接的反向Ajax技术,它允许服务器向客户端浏览器主动推送数据,从而实现双向通信。在Web应用中,通常的HTTP请求是客户端发起的,而Comet打破了这种模式,使得服务器可以在适当的时候主动...

    基于comet服务器推技术思路的Pushlet技术实现1

    总结起来,基于Comet的Pushlet技术通过长轮询和流方式实现了高效的服务器向客户端的数据推送,有效地解决了Web实时通信的问题,尤其适用于需要实时交互的场景。无论是长轮询还是流方式,都利用了HTTP连接的持久性,...

    comet4j 自己写的消息推送 觉得实用

    Comet4j 是一个开源的 Java 框架,用于实现实时的、双向的、基于 HTTP 长连接的消息推送服务,它解决了传统 HTTP 请求响应模式下难以实现服务器主动向客户端推送信息的问题。 在 Web 应用中,消息推送技术是必不可...

    服务器推送技术之comet4j资源包

    Comet技术是一种HTTP持久连接技术,它通过长时间保持HTTP连接来实现实时通信,使得服务器能够随时向浏览器推送数据。Comet4j框架正是基于这种技术,为Java开发者提供了一套简单易用的API,以处理服务器与客户端之间...

    php 长连接服务器端

    总之,PHP长连接服务器端是实现Web即时通讯的重要技术手段,通过Comet或WebSocket等技术,可以创建高效、实时的通讯系统。在实际开发中,需要综合考虑性能、安全、兼容性等多个方面,才能构建出稳定、易用的解决方案...

    web推送 comet技术

    Comet技术是一种基于HTTP长连接的Web实时通信技术,它允许服务器向客户端主动推送数据,而无需客户端发起新的请求。这种技术打破了传统的HTTP请求-响应模型,极大地提升了Web应用的实时性和交互性,尤其适用于股票...

    comet4j服务器推可运行DEMO

    Comet4j是一款基于Java平台的服务器推送技术框架,它主要设计用于实现实时的、双向的通信,使得服务器能够主动向客户端推送数据,而不仅仅局限于传统的HTTP请求响应模式。在Web开发中,这种技术可以极大地提升用户...

    服务器推comet4j

    为了解决这个问题,Comet技术应运而生,它通过长时间保持HTTP连接来实现服务器主动推送数据到客户端。 Comet4j是一个开源的Java库,专门用于实现服务器推功能。它提供了高效的、跨平台的服务器推解决方案,允许...

    基于Comet推送技术的实时图形控件

    综上所述,基于Comet推送技术的asp.net实时图形控件是现代Web应用中的一个重要组成部分,它结合了服务器推送的优势和动态图形的可视化效果,为用户提供了一种直观且实时的数据展示方式。在实际开发中,开发者需要...

Global site tag (gtag.js) - Google Analytics