Comet技术详解:基于HTTP长连接的Web端实时通信技术

前言

一般的话,Web端即时通讯技术以受压浏览器的筹划范围,一直以来实现起来连无爱,主流的Web端即时通讯方案大致有4种植:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent
Events)。

关于这4种植技术措施的利弊,请参考《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》。本文将专门教Comet技术。(本文同步颁布于:http://www.52im.net/thread-334-1-1.html)

上学交流


即时通讯开发交流群:215891622 [推荐]


更多即时通讯技术资料:http://www.52im.net/forum.php?mod=collection&op=all

概述

本文将介绍如何以现有的技巧基础及摘取适用的方案开发一个“服务器推”(Comet技术)的运用,最美好的方案要取决于应用需求的自我。相对于人情的
Web 应用, 开发 Comet 应用拥有自然的挑战性。

以WebSocket技术尚未完全解决浏览器兼容问题前,“服务器推”(Comet技术)存在广泛的采用需求,需求促进技术的进步,Comet
技术以Web端即时通讯的方案里几乎不可或缺。

“服务器推”(Comet技术)的用范围

传统模式的 Web
系统以客户端发出请求、服务器端响应的章程行事。这种措施并无可知满足广大切实应用之求,譬如:

1] 监控网:后台硬件热插拔、LED、温度、电压发生变化;

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

3] 即时报价系统:后台数据库内容发生变化。

这些以都急需服务器能够实时地将履新的音传递到客户端,而不要客户端发出请求。“服务器推”技术以切实应用中生出一部分化解方案,本文将这些解决方案分为两看似:一看似需要以浏览器端安装插件,基于套接口传送信息,或是使用
RMI、CORBA 进行长途调用;而任何一样类似则毫不浏览器安装其他插件、基于 HTTP
长连接。

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

1]
客户端如何接纳、处理信息,是否用使用模拟接口或是使用远程调用。客户端表现给用户的是
HTML 页面还是 Java applet 或 Flash
窗口。如果利用模拟接口及长距离调用,怎么和 JavaScript 结合修改 HTML
的显得。

2] 客户和劳动器端通信的信息格式,采取哪些的差处理机制。

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

来探望更俗的基于客户端套接口的“服务器推”技术

1)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 通道端口进行界定。

只是这种方案以部分网聊天室,网络互动游戏被都获大规模采取。

2)Java Applet 套接口

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

这种方案最深之阙如在 Java applet 在收服务器端返回的信后,无法通过
JavaScript 去创新 HTML 页面的内容。

依据 HTTP 长连接的“服务器推”技术:Comet技术

1)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?cm_mc_uid=72410021035714633836363&cm_mc_sid_50200000=1464236784)。

下用介绍两种 Comet 应用的实现模型。

2)Comet技术实现模型1:基于 AJAX 的长轮询(long-polling)方式

一旦 图 1 所示,AJAX 的面世叫 JavaScript 可以调用 XMLHttpRequest
对象有 HTTP 请求,JavaScript 响应处理函数根据服务器返回的音信对 HTML
页面的显得进行翻新。使用 AJAX 实现“服务器推”与习俗的 AJAX
应用不同之处在于:

服务器端会阻塞请求直到发生数量传递或过期才返回。

客户端 JavaScript
响应处理函数会以处理完毕服务器返回的信后,再次发出请求,重新建连接。

当客户端处理接收的数、重新建连接时,服务器端可能发新的数额达;这些信息会于服务器端保存直到客户端重新建连接,客户端会一差把当前劳动器端所有的音取回。

贪图 2. 基受长轮询的服务器推模型:

有的利用及示例如 “Meebo”, “Pushlet Chat”
都采用了这种增长轮询的法门。相对于“轮询”(poll),这种增长轮询方式为堪称作“拉”(pull)。因为这种方案基于
AJAX,具有以下部分独到之处:请求异步发出;无须设置插件;IE、Mozilla FireFox
都支持 AJAX。

当这种增长轮询方式下,客户端是在 XMLHttpRequest 的 readystate 为
4(即数据传了)时调用回调函数,进行信息处理。当 readystate 为 4
时,数据传截止,连接已关闭。Mozilla Firefox 提供了对 Streaming AJAX
的支持, 即 readystate 为 3
时(数据以在传中),客户端可读取数据,从而无须关闭连接,就可知读取处理服务器端返回的信。IE
在 readystate 为 3 时,不能够读取服务器返回的多寡,目前 IE 不支持因
Streaming AJAX。

3)Comet技术实现模型2:基于 Iframe 及 htmlfile
的流(streaming)方式

上节提到的 AJAX 方案是以 JavaScript 里处理 XMLHttpRequest
从服务器取回之数,然后 Javascript 可以非常有利的失控制 HTML
页面的来得。同样的思路用当 iframe 方案的客户端,iframe
服务器端并无回来直接展示在页面的数量,而是回到对客户端 Javascript
函数的调用,如“js_func(“data from server
”)”。服务器端将回的数据作客户端 JavaScript
函数的参数传递;客户端浏览器的 Javascript 引擎在吸纳服务器返回的
JavaScript 调用时虽见面失去履行代码。

起 图 3
可以望,每次数据传送不会见倒闭连接,连接只会以通信出现谬误时,或是连接重建时关闭(一些防火墙常被设置为抛弃弃过长之接连,
服务器端可以安装一个逾期时间,
超时后通知客户端重新确立连接,并关闭原来的连天)。

下 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 浏览器,可以看做参考。

运用 Comet 模型开发好之应用

点介绍了少于栽基于 HTTP
长连接的“服务器推”架构,更多描述了客户端处理长连的艺。对于一个其实的使用而言,系统的安定团结和性质是好关键之。将
HTTP 长连接用于实际运用,很多细节要考虑。

1)不要以一如既往客户端同时使用超过两单的 HTTP 长连接

俺们利用 IE 下载文件时见面产生这样的经验,从与一个 Web
服务器下载文件,最多只能发出半点独文本又深受下载。第三单文件的下载会于死,直到前下载的文本下充斥了。这是坐
HTTP 1.1 规范中确定,客户端不应当与劳动器端建立跨两个之 HTTP 连接,
新的连天会于卡住。而 IE 在落实中严厉遵循了这种规定。

HTTP 1.1 对少个增长连的限量,会指向以了长连的 Web
应用带来如下现象:在客户端如果打开过两只的 IE
窗口去看同一个运了长连的 Web 服务器,第三单 IE 窗口的 HTTP
请求让前少独窗口的增长连阻塞。

之所以在付出长连的以时, 必须注意在使用了大半独 frame
的页面被,不要也每个 frame 的页面还成立一个 HTTP
长连接,这样会堵塞其它的 HTTP 请求,在设计达到考虑被大多单 frame
的翻新共用一个添加连。

2)服务器端的习性与而扩展性

一般 Web 服务器会为每个连创建一个线程,如果在巨型的小买卖利用被使用
Comet,服务器端需要保护大量油然而生的丰富连。在这种利用背景下,服务器端需要考虑负载均衡和集群技术;或是在劳务器端为丰富连作一些改善。

使用与技能之进化总是带来新的需要,从而促进新技巧的迈入。HTTP 1.1 与 1.0
规范来一个要命非常的例外:1.0 规范下服务器在拍卖完毕每个 Get/Post
请求后会关闭套接口连接; 而 1.1
规范下服务器会维持这个连续,在拍卖两只请求的间隔时间里,这个连续处空闲状态。
Java 1.4 引入了支持异步 IO 的 java.nio
包。当连接处空闲时,为者连续分配的线程资源会返还到线程池,可以供应新的连接使用;当原来处于空闲的连的客户来新的伸手,会从线程池里分配一个线程资源处理这个要。
这种技能于接连处空闲的机率较高、并作连接数目很多之气象下对降低服务器的资源负载非常管用。

但 AJAX 的用使求的起转移得频繁,而 Comet
则会长时占一个连连,上述的服务器模型在初的采取背景下会变得不行低效,线程池里区区的线程数甚至可能会见阻塞新的连接。Jetty
6 Web 服务器对 AJAX、Comet
应用之表征开展了广大翻新的改进,请参考文章“AJAX,Comet and Jetty”。

3)控制信息以及数据信息应用不同的 HTTP 连接

使用长连时,存在一个十分宽泛的观:客户端网页需要关闭,而服务器端还处在读取数据的堵塞状态,客户端需要立即通知服务器端关闭数连接。服务器在收到关闭请求后率先使打读取数据的阻塞状态唤醒,然后放也夫客户端分配的资源,再关连接。

为此在计划达到,我们需要而客户端的主宰请求与数码要使用不同的 HTTP
连接,才会使控制请求不见面被死。

在贯彻达标,如果是依据 iframe 流方式的增长连,客户端页面需要使用有限只
iframe,一个是控制帧,用于向服务器端发送控制请求,控制请求能挺快收到响应,不会见于堵塞;一个凡显示帧,用于向服务器端发送增长连要。如果是依据
AJAX 的丰富轮询方式,客户端好异步地起一个 XMLHttpRequest
请求,通知服务器端关闭数连接。

4)在客户和服务器之间保持“心跳”信息

于浏览器与服务器之间维持一个添加连接会为通信带来有休明了:因为数量传是随机的,客户端不清楚何时服务器才产生多少传送。服务器端需要确保当客户端不再工作经常,释放也这客户端分配的资源,防止内存泄漏。因此要同种体制而二者理解大家都以例行运转。在实现上:

劳务器端在堵塞读常会见装一个期,超时后阻塞读调用会回去,同时发放客户端从未新数据达的心底跳信息。此时一经客户端已关门,服务器往通道写数据会出现异常,服务器端就见面即时放出也这客户端分配的资源。

使客户端采用的凡因 AJAX
的丰富轮询方式;服务器端返回数据、关闭连接后,经过某个时限没有接收客户端的再呼吁,会看客户端不能够正常工作,会自由也这客户端分配、维护的资源。

当服务器处理信息出现异常情况,需要发送错误信息通知客户端,同时释放资源、关闭连接。

Comet开源工程推荐

Pushlet:

Pushlet 是一个开源的 Comet
框架,在规划上发出多值得借鉴之地方,对于开发轻量级的 Comet
应用特别有参考价值。使用了观察者模型。浏览器端提供了因 AJAX 和 iframe 的
JavaScript 库,服务器端使用 Java
Servlet。地址是:http://www.pushlets.com/?cm\_mc\_uid=72410021035714633836363&cm\_mc\_sid\_50200000=1464236784

iComet:

iComet 是一个施用 C++ 语言开发的支持百万并作连接的 comet/push 服务器,
支持百万级并发连接, 内存占用掉, 性能优越. 可用于移动 App 的 Push
Server(消息推送服务器), 或者用于 Web Push(Web 服务器推). 用于 Web Push
时, 支持的浏览器与操作系统平台包括: Safari(iOS, Mac),
Firefox/Chrome(Windows, Mac),
IE6+。详细请参见:http://www.52im.net/thread-330-1-1.html

星罗棋布文章

�Web端即时通讯新手入门:

《新手入门:详解Web端即时通讯技术的原理》

�Web端即时通讯技术盘点请参见:

《Web端即时通讯技术盘点:短轮询、Comet、Websocket、SSE》

关于Ajax短轮询:

摸就面的材料没什么意思,除非忽悠客户,否则要考虑其他3种方案即可。

至于Comet技术�的详实介绍请参见:

《Comet技术详解:基于HTTP长连接的Web端实时通信技术》

《WEB端即时通讯:HTTP长连接、长轮询(long
polling)详解》

《WEB端即时通讯:不用WebSocket也一样能搞定消息之尽管时性》

《开源Comet服务器iComet:支持百万产出的Web端即时通讯�方案》

至于WebSocket的详实介绍请参见:

《WebSocket详解(一):初步识WebSocket技术》

《WebSocket详解(二):技术原理、代码演示和行使案例》

《WebSocket详解(三):深入WebSocket通信协议细节》

《Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架》

《socket.io和websocket
之间是什么关系?有啊分别?》

有关SSE的详尽介绍文章呼吁参见:

《SSE技术详解:一栽全新的HTML5服务器推送事件技术》

双重多WEB端即时通讯文章呼吁见:

http://www.52im.net/forum.php?mod=collection&action=view&ctid=15

(本文同步发布让:http://www.52im.net/thread-334-1-1.html)

作者:Jack
Jiang(点击作者姓名进入Github)

出处:http://www.52im.net/space-uid-1.html

交流:�欢迎加入即时通讯开发交流群215891622

讨论:�http://www.52im.net/

Jack Jiang同时是【原创Java
Swing外观工程BeautyEye】和【轻量级移动端即时通讯框架MobileIMSDK】的作者,可通往下充斥交流。