您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 销售管理 > Comet基于HTTP长连接的“服务器推”技术
Comet:基于HTTP长连接的“服务器推”技术“服务器推”技术的应用请访问Ajax技术资源中心,这是有关Ajax编程模型信息的一站式中心,包括很多文档、教程、论坛、blog、wiki和新闻。任何Ajax的新信息都能在这里找到。订阅Ajax相关文章和教程的RSS提要传统模式的Web系统以客户端发出请求、服务器端响应的方式工作。这种方式并不能满足很多现实应用的需求,譬如:监控系统:后台硬件热插拔、LED、温度、电压发生变化;即时通信系统:其它用户登录、发送信息;即时报价系统:后台数据库内容发生变化;这些应用都需要服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求。“服务器推”技术在现实应用中有一些解决方案,本文将这些解决方案分为两类:一类需要在浏览器端安装插件,基于套接口传送信息,或是使用RMI、CORBA进行远程调用;而另一类则无须浏览器安装任何插件、基于HTTP长连接。将“服务器推”应用在Web程序中,首先考虑的是如何在功能有限的浏览器端接收、处理信息:客户端如何接收、处理信息,是否需要使用套接口或是使用远程调用。客户端呈现给用户的是HTML页面还是Javaapplet或Flash窗口。如果使用套接口和远程调用,怎么和JavaScript结合修改HTML的显示。客户与服务器端通信的信息格式,采取怎样的出错处理机制。客户端是否需要支持不同类型的浏览器如IE、Firefox,是否需要同时支持Windows和Linux平台。基于客户端套接口的“服务器推”技术FlashXMLSocket如果Web应用的用户接受应用只有在安装了Flash播放器才能正常运行,那么使用Flash的XMLSocket也是一个可行的方案。这种方案实现的基础是:Flash提供了XMLSocket类。JavaScript和Flash的紧密结合:在JavaScript可以直接调用Flash程序提供的接口。具体实现方法:在HTML页面中内嵌入一个使用了XMLSocket类的Flash程序。JavaScript通过调用此Flash程序提供的套接口接口与服务器端的套接口进行通信。JavaScript在收到服务器端以XML格式传送的信息后可以很容易地控制HTML页面的内容显示。关于如何去构建充当了JavaScript与FlashXMLSocket桥梁的Flash程序,以及如何在JavaScript里调用Flash提供的接口,我们可以参考AFLAX(AsynchronousFlashandXML)项目提供的SocketDemo以及SocketJS(请参见参考资源)。Javascript与Flash的紧密结合,极大增强了客户端的处理能力。从Flash播放器V7.0.19开始,已经取消了XMLSocket的端口必须大于1023的限制。Linux平台也支持FlashXMLSocket方案。但此方案的缺点在于:客户端必须安装Flash播放器;因为XMLSocket没有HTTP隧道功能,XMLSocket类不能自动穿过防火墙;因为是使用套接口,需要设置一个通信端口,防火墙、代理服务器也可能对非HTTP通道端口进行限制;不过这种方案在一些网络聊天室,网络互动游戏中已得到广泛使用。JavaApplet套接口在客户端使用JavaApplet,通过java.net.Socket或java.net.DatagramSocket或java.net.MulticastSocket建立与服务器端的套接口连接,从而实现“服务器推”。这种方案最大的不足在于Javaapplet在收到服务器端返回的信息后,无法通过JavaScript去更新HTML页面的内容。基于HTTP长连接的“服务器推”技术Comet简介浏览器作为Web应用的前台,自身的处理功能比较有限。浏览器的发展需要客户端升级软件,同时由于客户端浏览器软件的多样性,在某种意义上,也影响了浏览器新技术的推广。在Web应用中,浏览器的主要工作是发送请求、解析服务器返回的信息以不同的风格显示。AJAX是浏览器技术发展的成果,通过在浏览器端发送异步请求,提高了单用户操作的响应性。但Web本质上是一个多用户的系统,对任何用户来说,可以认为服务器是另外一个用户。现有AJAX技术的发展并不能解决在一个多用户的Web应用中,将更新的信息实时传送给客户端,从而用户可能在“过时”的信息下进行操作。而AJAX的应用又使后台数据更新更加频繁成为可能。图1.传统的Web应用模型与基于AJAX的模型之比较“服务器推”是一种很早就存在的技术,以前在实现上主要是通过客户端的套接口,或是服务器端的远程调用。因为浏览器技术的发展比较缓慢,没有为“服务器推”的实现提供很好的支持,在纯浏览器的应用中很难有一个完善的方案去实现“服务器推”并用于商业程序。最近几年,因为AJAX技术的普及,以及把IFrame嵌在“htmlfile“的ActiveX组件中可以解决IE的加载显示问题,一些受欢迎的应用如meebo,gmail+gtalk在实现中使用了这些新技术;同时“服务器推”在现实应用中确实存在很多需求。因为这些原因,基于纯浏览器的“服务器推”技术开始受到较多关注,AlexRussell(DojoToolkit的项目Lead)称这种基于HTTP长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”。目前已经出现了一些成熟的Comet应用以及各种开源框架;一些Web服务器如Jetty也在为支持大量并发的长连接进行了很多改进。关于Comet技术最新的发展状况请参考关于Comet的wiki。下面将介绍两种Comet应用的实现模型。基于AJAX的长轮询(long-polling)方式如图1所示,AJAX的出现使得JavaScript可以调用XMLHttpRequest对象发出HTTP请求,JavaScript响应处理函数根据服务器返回的信息对HTML页面的显示进行更新。使用AJAX实现“服务器推”与传统的AJAX应用不同之处在于:服务器端会阻塞请求直到有数据传递或超时才返回。客户端JavaScript响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。当客户端处理接收的数据、澳门新濠天地66bb.org重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。图2.基于长轮询的服务器推模型一些应用及示例如“Meebo”,“PushletChat”都采用了这种长轮询的方式。相对于“轮询”(poll),这种长轮询方式也可以称为“拉”(pull)。因为这种方案基于AJAX,具有以下一些优点:请求异步发出;无须安装插件;IE、MozillaFireFox都支持AJAX。在这种长轮询方式下,客户端是在XMLHttpRequest的readystate为4(即数据传输结束)时调用回调函数,进行信息处理。当readystate为4时,数据传输结束,连接已经关闭。MozillaFirefox提供了对StreamingAJAX的支持,即readystate为3时(数据仍在传输中),客户端可以读取数据,从而无须关闭连接,就能读取处理服务器端返回的信息。IE在readystate为3时,不能读取服务器返回的数据,目前IE不支持基于StreamingAJAX。基于Iframe及htmlfile的流(streaming)方式iframe是很早就存在的一种HTML标记,通过在HTML页面里嵌入一个隐蔵帧,然后将这个隐蔵帧的SRC属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。图3.基于流方式的服务器推模型上节提到的AJAX方案是在JavaScript里处理XMLHttpRequest从服务器取回的数据,然后Javascript可以很方便的去控制HTML页面的显示。同样的思路用在iframe方案的客户端,iframe服务器端并不返回直接显示在页面的数据,而是返回对客户端Javascript函数的调用,如“scripttype=text/javascriptjs_func(“datafromserver”)/script”。服务器端将返回的数据作为客户端JavaScript函数的参数传递;客户端浏览器的Javascript引擎在收到服务器返回的JavaScript调用时就会去执行代码。从图3可以看到,每次数据传送不会关闭连接,连接只会在通信出现错误时,或是连接重建时关闭(一些防火墙常被设置为丢弃过长的连接,服务器端可以设置一个超时时间,超时后通知客户端重新建立连接,并关闭原来的连接)。使用iframe请求一个长连接有一个很明显的不足之处:IE、MorzillaFirefox下端的进度栏都会显示加载没有完成,而且IE上方的图标会不停的转动,表示加载正在进行。Google的天才们使用一个称为“htmlfile”的ActiveX解决了在IE中的加载显示问题,并将这种方法用到了gmail+gtalk产品中。AlexRussell在“Whatelseisburrieddowninthedepth'sofGoogle'samazingJavaScript?”文章中介绍了这种方法。Zeitoun网站提供的comet-iframe.tar.gz,封装了一个基于iframe和htmlfile的JavaScriptcomet对象,支持IE、MozillaFirefox浏览器,可以作为参考。(请参见参考资源)使用Comet模型开发自己的应用上面介绍了两种基于HTTP长连接的“服务器推”架构,更多描述了客户端处理长连接的技术。对于一个实际的应用而言,系统的稳定性和性能是非常重要的。将HTTP长连接用于实际应用,很多细节需要考虑。不要在同一客户端同时使用超过两个的HTTP长连接我们使用IE下载文件时会有这样的体验,从同一个Web服务器下载文件,最多只能有两个文件同时被下载。第三个文件的下载会被阻塞,直到前面下载的文件下载完毕。这是因为HTTP1.1规范中规定,b31.org客户端不应该与服务器端建立超过两个的HTTP连接,新的连接会被阻塞。而IE在实现中严格遵守了这种规定。HTTP1.1对两个长连接的限制,会对使用了长连接的Web应用带来如下现象:在客户端如果打开超过两个的IE窗口去访问同一个使用了长连接的Web服务器,第三个IE窗口的HTTP请求被前两个窗口的长连接阻塞。所以在开发长连接的应用时,必须注意在使用了多个frame的页面中,不要为每个frame的页面都建立一个HTTP长连接,这样会阻塞其它的HTTP请求,在设计上考虑让多个frame的更新共用一个长连接。服务器端的性能和可扩展性一般Web服务器会为每个连接创建一个线程,如果在大型的商业应用中使用Comet,服务器端需要维护大量并发的长连接。在这种应用背景下,服务器端需要考虑负载均衡和集群技术;或是在服务器端为长连接作一些改进。应用和技术的发展总是带来新的需求,从而推动新技术的发展。HTTP1.1与1.0规范有一个很大的不同:1.0规范下服务器在处理完每个Get/Post请求后会关闭套接口连接;而1.1规范下服务器会保持这个连接,在处理两个请求的间隔时间里,这个连接处于空闲状态。Java1.4引入了支持异步IO的java.nio包。当连接处于空闲时,为这个连接分配的线程资源会返还到线程池,可以供新的连接使用;当原来处于空闲的连接的客户发出新的请求,会从线程池里分配一个线程资源处理这个请求。这种技术在连接处于空闲的机率较高、并发连接数目很多的场景下对于降低服务器的资源负载非常有效。但是AJAX的应用使请求的出现变得频繁,而Comet则会长时间占用一个连接,上述的服务器模型在新的应用背景下会变得非常低效,线程池里有限的线程数甚至可能会阻塞新的连接。Jetty6Web服务器针对AJAX、Comet应用的特点进行了很多创新的改进,请参考文章“AJAX,CometandJetty”(请参见参考资源)。控制信息与数据信息使用不同的HTTP连接使用长连接时
本文标题:Comet基于HTTP长连接的“服务器推”技术
链接地址:https://www.777doc.com/doc-2906584 .html