Comet
在web 开发中,Comet是一个新词来描述一种web app模型
,长连接的HTTP请求
,允许web Server推送数据到浏览器
,而不用浏览器显式地请求。Comet是一个实现这种交互的多种技术的涵盖性术语
。这些方法依赖于浏览器的默认特性,就像JavaScript,而不是非默认的插件。
在理论上,Comet方法不同于原始的web 模型,原始的web模型中浏览器请求一个完整的web页面,或者一个web页面的块。然而,实践上,Comet app一般使用长轮询的Ajax来检测server上是否有新的信息。这个概念早于这个新词的产生,也叫做Ajax Push
, Reverse Ajax
, Two-way-web, Http Streaming
, 和HTTP server push。
Implementation
Comet是一个试图消除页面到页面跳转web模式和传统轮询的限制的涵盖性术语,像Comet一样的app通过持续的HTTP连接,提供实时的交互
(可能不是一个长期持续的HTTP连接),给web app任命的浏览器提供更新。既然浏览器和代理不是设计成带有server event的,web app开发人员尝试了一些非计划的副作用来实现Comet一样的行为,每一种都有优点和缺点。实际上,HTTP 1.1规范声明一个浏览器不应该和一个web server同时有超过2个的连接
。然而,为实时事件保持一个打开连接对浏览器的可用性有副作用。当它加载的时候可能被阻塞而不能发出一个新的请求,例如,一系列图片。为实时信息创建一个不同的主机名,就是同一台物理server的别名,可以实现这一点。
实现Comet的具体的方法分成两个范畴:streaming(流)和long polling(长轮询)
。
Streaming
在一个app中使用streaming Comet,浏览器为所有的Comet事件,打开一个单独的和server的连接,在浏览器端被递增的处理。每一次server发送一个新的事件,浏览器解释它,但是两端都不关闭连接。
实现streaming Comet的具体技术包括以下这些。
Hidden IFrame
动态web app一个简单技术是使用hidden IFrame HTML元素
(一个内联框架,允许一个网站将一个HTML文件嵌入另一个)。这个不可见的IFrame作为长条的块发送,显式地声明它是无限长时间(有时叫做“永远的框架”)。随着事件发生,这个iframe逐步地填充script脚本,包含将在浏览器中执行的JavaScript。因为浏览器逐步地渲染HTML页面,每个script标签随着被接收到会被执行。
IFrame的一个好处是它可以工作在每种普通的浏览器中。这种技术的两种下滑趋势是缺乏一种可信任的错误处理方法,和不可能跟踪请求调用过程的状态。
XMLHttpRequest
XMLHttpRequest(XHR) 对象,是Ajax app用于浏览器-server通信的主要工具,也可以暂时
用于服务器-浏览器Comet消息传送,通过一些不同的方式。
在1995年,Netscape Navigator增加一个特点叫做“server push”,允许服务器发送一个图片或HTML页面的新版本给浏览器,作为一个多部分HTTP响应的一个部分,使用multipart/x-mixed-replace content类型。自从2004年,基于Gecko的浏览器就如FireFox给XHR加入了多部分响应,它就因此可被用于一种streaming Comet传输。在服务器端,每个消息被编码成多部分响应的一个单独部分,在客户端,随着每个信息到达,提供给XHR onreadystatechange函数的回调函数会被调用。
这个功能只被包含在基于Gecko的浏览器中,即使有讨论将它加入Webkit。
不是创建一个多部分的响应,依赖浏览器透明地解析每个事件,它也可能为一个XHR响应生成一个客户数据格式,用浏览器端JavaScript解析每个事件,只是依赖于浏览器每次接收新数据时打开onreadystatechange回调。
Ajax with long polling
以上streaming传输没有一个工作在所有的现代浏览器而不或多或少产生消极的副作用——迫使Comet开发者实现复杂的streaming传输,在根据浏览器的不同而转换它们。因此许多Comet app选择long polling,更容易在浏览器端实现,
工作,在每个支持XHR的浏览器中。顾名思义,long polling需要客户端向服务器轮询一个事件(或者一组事件)。浏览器向服务器提出一个Ajax风格的请求,它会一直保持打开直到服务器有新的数据向浏览器发送,是以一种复杂的响应发送。浏览器为了获得随后的事件,初始化一个新的long polling请求。
实现long polling的具体技术包含以下这些。
XMLHttpRequest long polling
在很大程度上,XMLHttpRequest long polling 就像任何XHR标准的使用那样工作。浏览器向服务器提出一个异步请求,在响应之前等待数据可用。响应可以包含编码数据(一般是XML或者JSON)或者将被客户端执行的JavaScript。在响应过程的结尾,浏览器创建并发送另一个XHR,来等待下一个事件。
这样浏览器总是保持比服务器多一个请求,随着每个事件发生而被答复。
Scripte tag long polling
任何Comet传输能跨子域工作,
由于浏览器的设计防止跨站点脚本攻击的安全策略,以上传输没有一个可以用于跨不同的二级域(SLDs)
。那就是,如果主页从一个SLD提供服务,Comet服务器位于另一个SLD,Comet事件不能使用这些传输修改主页的HTML和DOM。这个问题可以通过在一方或双方资源前创建代理服务器
来避免。使他们好像是源自同一个域。然而出于复杂性和性能
的原因,这个通常不受欢迎。
不像IFrame或者XMLHttpRequest对象,script 标签能在任何URL,和在响应中将在当前HTML文件执行的JavaScript代码中被指向。这就给包含的双方server产生一个潜在的安全风险,即使数据提供者的风险可以通过使用JSONP被避免。
一个long polling Comet传输能通过动态创建script元素而被创建,设置他们的source给Comet服务器的地址
,正如它的有效载荷,随着一些事件发送回JavaScript(JSONP)。每次script请求完成,浏览器打开一个新的,正如在XHR long polling的情况。这个方法有可以跨浏览器和跨域
实现的优点。
History
早期Java applets
略
First Comet applications
在2006年3月,软件工程师Alex Russell在他自己博客的帖子中创造了术语Comet,这个新的术语。
在2006年,不是真正使用术语Comet,一些应用暴露这些技术给更广泛的观众: Meebo的多协议基于web的聊天应用使用户可以通过浏览器联系AOL、Yahoo和Microsoft聊天平台;Google给Gmail加入基于web的聊天
;JotSpot
, 被Google需要而建立,创建了基于Comet实时交互的文件编辑
;基于Comet的聊天是Renkoo
事件计划的中心。新的Comet公司和企业解决方案被创建,就如基于Java的ICEfaces框架(即使他们喜欢术语“Ajax Push”),其他从前使用基于Java-applet的传输,取代纯JavaScript的实现。
Alternatives
Browser-native技术是Comet术语所固有的。可以从多方面尝试改进non-polling
HTTP通信。
-
HTML 5
草稿规格,由Web Hypertext Application Technology Working Group (WHATWG)创建,指定所谓的server-sent
事件,它提供一个新的HTML元素,event-source
和一个新的数据格式叫做DOM事件流
。这个特色的实验性实现被引入Opera。
-
HTML 5 Web Socket API
工作草案指定一个与服务器创建持久连接的方法,接收消息通过onmessage回调。
-
Dojo基金会的Bayeux协议
。它留浏览器特有的传输在适当的地方,定义了一个浏览器和服务器间通信的更高水平的协议,目的是允许多个Comet服务器重用客户端的JavaScript代码,也允许同一个Comet服务器和多个客户端的JavaScript实现通信。Bayeux是基于发布/订阅模式,所以支持Bayeux的服务器有发布/订阅的内置。
-
XMPP标准基金会的BOSH协议
。通过使用两个同步的HTTP连接,它效仿一个双向的浏览器和服务器间的流。
-
JSONRequest对象
,由Douglas Crockford提出的,会是XHR对象的替代选择。
-
使用插件
,就像Java applets
或者Adobe Flash
(Java BlazeDS是一个服务器插件,它的流事件给Flash应用)。这些的优势是跨所有的浏览器工作同样地工作,用适当的安装的插件而不依赖HTTP连接,但是缺点是需要安装插件。
References
略
External links
-
Comet Daily
– 一个奉献于Comet技术的文章的网站
Comparison of several comet server implementations
分享到:
相关推荐
将Comet与IFrame结合,可以在IFrame中利用Comet技术实现数据的实时更新,这对于构建实时聊天、股票报价、在线游戏等应用非常有用。 PHPComet是一款基于PHP的Comet服务器,它提供了一种简单的方法来实现PHP环境下的...
comet-ajax聊天comet-ajax聊天comet-ajax聊天comet-ajax聊天comet-ajax聊天comet-ajax聊天comet-ajax聊天comet-ajax聊天comet-ajax聊天
(Comet-)ATOMIC 2020:关于符号和神经常识知识图 纸 耶拿·黄(Jena D. Hwang),钱德拉(Chandra Bhagavatula),罗南·勒布拉斯(Ronan Le Bras),杰夫·达(Jeff Da),坂口圭介(Keisuke Sakaguchi),安托万...
里面东西很多,都是关于GWT-COMET的内容,实现gwt的服务器推技术,包括gwt-comet-examples-1.2.3:google官网上的Test实例;gwt-comet-1.2.3.jar:jar包,gwt-example:聊天实例源代码(.java的),gwt-event-source...
在本文中,我们将深入探讨名为"unbabel-comet-0.0.1"的Python库,该库被封装在一个名为"unbabel-comet-0.0.1.tar.gz"的压缩文件中。 "unbabel-comet-0.0.1.tar.gz"是一个典型的源代码打包文件,它采用了tar格式用于...
atmosphere-flick-comet-0.2-m1-sources.jar
atmosphere-flick-comet-0.3.1-sources.jar
atmosphere-flick-comet-0.5.1-sources.jar
atmosphere-flick-comet-0.4-sources.jar
atmosphere-flick-comet-0.3-sources.jar
atmosphere-flick-comet-0.2-sources.jar
atmosphere-flick-comet-0.1-sources.jar
科密点钞机升级操作指引教程,升级识别2015版人民币 WJD-Comet-A30 WJD-Comet-B329 WJD-Comet-C518 WJD-Comet-D629 WJD-Comet-KM2800 WJD-Comet-KM6800
Comet-For-MLFlow扩展 Comet-For-MLFlow扩展是一个CLI,可将MLFlow实验运行映射到Comet实验。 此扩展程序使您可以在Comet.ml UI中查看现有实验,该UI提供了对实验结果的经过身份验证的访问权限,大大提高了大批量...
【comet-jquery】是一种基于jQuery的实时通信技术,它利用了Comet技术来实现服务器向客户端推送数据的功能。在Web开发中,传统的HTTP协议是请求-响应模式,即客户端发起请求,服务器返回数据,而Comet技术打破了这种...
科密票据打印机官方驱动程序 COMET-CM-30是CM-30票据打印机的官方驱动,使用这款驱动能完美驱程COMET-CM-30的票据打印机,有需要的用户可以下载驱动程序安装。小编已经把win32位和win64位的驱动都打包在压缩包里,请...
科密票据打印机官方驱动程序 COMET-CK-300K是CK-300K打印机的专用驱动程序,能完美驱程COMET-CK-300K的票据打印机,有需要的用户可以下载驱动程序安装。小编提供了32位和64位的驱动,请用户根据自身系统选择对应的...
《Python库Comet_ml-2.0.12:跟踪、优化与实验管理》 在IT行业中,Python作为一门强大的开发语言,拥有丰富的库支持,其中Comet_ml就是一款专为机器学习和深度学习项目提供实验跟踪、模型优化以及协作功能的库。...
Comet是一种Web实时通信技术,它允许服务器向客户端推送数据,而不仅仅是响应客户端的请求,从而实现了双向通信。 【描述】提到的是一个用C++编写的Comet服务器,该服务器目前提供PHP接口,简化了Comet应用程序的...
Comet-Java-SDK该项目仍在开发中。使用Comet Java SDK: 最新的发行版本可在Maven Central中获得: : q 将相应的依赖项添加到pom.xml。 例如: <dependencies> <dependency> <groupId>ml.comet</groupId> ...