C语言Comet技术详解:基于HTTP长连接的Web端实时通讯技术

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】的撰稿人,可前往下载调换。

前言

貌似的话,Web端即时通信技术因受限于浏览器的筹划范围,向来以来完成起来并不简单,主流的Web端即时通信方案大约有4种:传统Ajax短轮询、Comet技术、WebSocket技术、SSE(Server-sent
伊芙nts)。

关于那4种技术措施的利害,请参考《Web端即时通信技术盘点:短轮询、Comet、Websocket、SSE》。本文将越发讲解Comet技术。(本文同步发表于:http://www.52im.net/thread-334-1-1.html

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

传统形式的 Web
系统以客户端发出请求、服务器端响应的艺术行事。那种办法并不可以满意广大切实应用的急需,譬如:

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

2] 即时通讯系统:别的用户登录、发送音信;

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

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

将“服务器推”应用在 Web
程序中,首先考虑的是怎么样在作用有限的浏览器端接收、处理音信:

1]
客户端怎么样吸收、处理新闻,是或不是要求运用套接口或是使用远程调用。客户端表现给用户的是
HTML 页面仍旧 Java applet 或 Flash
窗口。如若使用套接口和远程调用,怎么和 JavaScript 结合修改 HTML
的体现。

2] 客户与服务器端通讯的消息格式,选择什么样的失误处理体制。

3] 客户端是还是不是须要扶助差别连串的浏览器如 IE、Firefox,是不是需求同时协理Windows 和 Linux 平台。

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

1)Comet 简介

浏览器作为 Web
应用的前台,自身的拍卖功用比较单薄。浏览器的向上急需客户端升级软件,同时鉴于客户端浏览器软件的各个性,在某种意义上,也影响了浏览器新技巧的拓宽。在
Web
应用中,浏览器的要紧工作是殡葬请求、解析服务器再次回到的音讯以分化的风骨展现。AJAX
是浏览器技术发展的成果,通过在浏览器端发送异步请求,提升了单用户操作的响应性。但
Web
本质上是一个多用户的体系,对其余用户来说,可以认为服务器是其它一个用户。现有
AJAX 技术的上进并不可能缓解在一个多用户的 Web
应用中,将履新的新闻实时传送给客户端,从而用户可能在“过时”的音信下开展操作。而
AJAX 的采纳又使后台数据更新越发频仍成为可能。

图 1. 传统的 Web 应用模型与基于 AJAX 的模型之相比:

“服务器推”是一种很已经存在的技艺,在此之前在促成上重大是通过客户端的套接口,或是服务器端的长途调用。因为浏览器技术的向上相比缓慢,没有为“服务器推”的落到实处提供很好的援救,在纯浏览器的使用中很难有一个全面的方案去贯彻“服务器推”并用于商业程序。近年来几年,因为
AJAX 技术的推广,以及把 IFrame 嵌在“htmlfile“的 ActiveX 组件中可以缓解
IE 的加载显示难点,一些受欢迎的行使如 meebo,gmail+gtalk
在落到实处中选取了这一个新技巧;同时“服务器推”在切实应用中确实存在许多须要。因为这么些原因,基于纯浏览器的“服务器推”技术开始受到较多关切,Alex拉塞尔(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 产品中。亚历克斯 拉塞尔 在
“What else is burried down in the depth’s of 谷歌’s amazing
JavaScript?”小说中介绍了那种艺术。Zeitoun 网站提供的
comet-iframe.tar.gz,封装了一个根据 iframe 和 htmlfile 的 JavaScript
comet 对象,帮衬 IE、Mozilla Firefox 浏览器,可以视作参考。

学学交换


即时电视揭橥支出调换群:215891622 [推荐]


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

概述

本文将介绍怎样在现有的技艺基础上选拔适宜的方案开发一个“服务器推”(Comet技术)的运用,最优的方案或者在于应用必要的本人。相对于传统的
Web 应用, 开发 Comet 应用拥有自然的搦战性。

在WebSocket技术没有完全缓解浏览器包容难题前,“服务器推”(Comet技术)存在普遍的行使必要,须要促进技术的向上,Comet
技术在Web端即时通信的方案里大致不可或缺。

来看看更传统的根据客户端套接口的“服务器推”技术

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 页面的内容。

选取 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
的长轮询方式;服务器端重临数据、关闭连接后,经过某个时限没有接到客户端的再次伸手,会认为客户端不可以健康办事,会自由为那么些客户端分配、维护的资源。

当服务器处理新闻现身卓殊处境,需要发送错误音信文告客户端,同时释放资源、关闭连接。