初识Comet技术 1、服务器推送技术概述 服务器推送技术(Servers Push)的基础思想是将浏览器主动查询信息改成服务器主动发送信息。服务器发送一批数据,浏览器显示这些数据,同时保证与服务器的链接。当服务器须要再次发送一批数据时,浏览器显示数据并保持链接。之后,服务器仍然能够发送批量数据,浏览器继续显示数据,依次类推 。主要应用于: 监控系统:报警提示; 即时通讯系统:其它用户登陆、发送信息; 即时报价系统:后台数据库内容发生变化; 实现基于web的实时事件通知 。 实现方式有: 基于客户端套接口 : 采用RMI、CORBA或者自定义TCP/IP信息的applet来实现 Comet: 基于 HTTP 长链接、无须在浏览器端安装插件的技术 1.传统轮询javascript
在Web早期,这一点常使用meta刷新实现。这将自动指示浏览器在指定秒数以后从新装载页面,从而支持简陋的轮询(polling)。例如在HTML文件中加入<META HTTP-RQUIV="Refresh" CONTENT=12>,实际上就是HTTP头标告知浏览器每12秒更新一次文档。php
优势:不须要服务器端的配置。 缺点:a) 糟糕的用户体验; b) 对服务器的压力很大,而且形成带宽的极大浪费。 2. Ajax轮询html
Ajax隔一段时间(一般使用JavaScript的setTimeout函数)就去服务器查询是否有改变,从而进行增量式的更新。可是间隔多长时间去查询成了问题,由于性能和即时性形成了严重的反比关系。间隔过短,接二连三的请求会冲垮服务器,间隔太长,务器上的新数据就须要越多的时间才能到达客户机。java
优势:a) 不须要太多服务器端的配置。b) 下降带宽的负荷(由于服务器返回的不是完整页面)。 缺点:a) 对服务器的压力并不会有明显的减小。b) 实时性差,有必定的延迟。 应用:这是一项很是常见的技术,例如,大多数webmail应用程序就是经过这种技术在电子邮件到达时显示电子邮件的。 2、Cometweb
Comet是一种用于web的推送技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求, Comet 有时也称反向Ajax或服务器端推技术(server-side push)。其思想很简单:将数据直接从服务器推到浏览器,而没必要等到浏览器请求数据。听起来简单,可是若是熟悉 Web 应用程序,尤为是HTTP协议,那么您就会知道,这毫不简单。实现Comet风格的Web应用程序,同时保证在浏览器和服务器上的可伸缩性,这只是在最近几年才成为可能。目前一些主流网站都有相似的原理,例如:webQQ、开心网、校内等等,它们中消息动态都是采用相似的技术,只是具体实现方式不同。算法
COMET的精髓就在于用服务器与javascript来维持浏览器的长链接,同时完成服务器端事件的浏览器端响应。这样的事件广播机制是跨网络的,同时也是实时的。数据库
采用了Comet技术的服务器在客户机作出一个请求后,和客户机创建一个永久的链接,而后服务器会根据客户机的请求不断把数据包推向客户,这个推的过程是不间断的。由服务器推向客户机的数据在客户机的浏览器上会不断产生新的内容,并且不会产生Client pull那样的HTML文档头,从而大大减小了延迟的时间,向(服务器响应--客户机请求)同步迈进了一步。编程
服务器推送一般效率要比客户端拖曳效率高,由于它没必要为后续数据创建新的链接。因为始终保持链接,即便没有数据传输时也是这样,所以服务器必须愿意分配这些TCP/IP端口,对于TCP/IP端口数有限的服务器这将是一个严重的问题。浏览器
客户端拖曳效率低,由于这必须每次为传送数据创建新的链接。可是它没必要始终保持链接。在实际状况中,创建HTTP链接一般须要花费至关多的时间,多达一秒甚至更多。所以从性能上考虑,服务器推送对于最终用户更有吸引力,特别是对于须要常常更新信息的状况下。服务器
服务器推送相对客户端拖曳的另外一点优点是,服务器推送相对比较容易控制。例如,服务器每一次推送时都保持一个链接,但它又随时能够关闭其中的任何链接,而不须要在服务器上设置特殊的算法。而客户端拖曳在一样的状况下要麻烦许多,它每次要与服务器创建链接,服务器为了处理将客户端拖曳请求与特定的最终用户匹配等状况,须要使用至关麻烦的算法。
如上所述,在服务器推送中,多个响应中链接始终保持,使服务器可在任什么时候间发送更多的数据。一个明显的好处是服务器彻底可以控制更新数据的时间和频率。另外,这种方法效率高,由于始终保持链接。缺点是保持链接状态会浪费服务器端的资源。服务器推送还比较容易中断。
Comet目前有两种实现方式,长轮询和iframe流。 基于AJAX长轮询(long-polling)——长轮询是在打开一条链接之后保持,等待服务器推送来数据再关闭的方式。即服务端阻断前一次对客户端的回应,在事件发生后将事件内容绑定在回应中返回给客户端,同时回应结束,此时客户端当即发送第二次请求,服务器阻塞回应等待下一次事件发生。 基于iframe及htmlfile流的方式——iframe流方式是在页面中插入一个隐藏的iframe,利用其src属性在服务器和客户端之间创建一条长连接,服务器向iframe传输数据(一般是HTML,内有负责插入信息的javascript),来实时更新页面。 iframe流方式的优势是浏览器兼容好,Google公司在一些产品中使用了iframe流,如Google Talk。 优势:实时性好(消息延时小);性能好(能支持大量用户)
缺点:长期占用链接,丧失了无状态高并发的特色
一、基于AJAX轮询方式与传统AJAX方式的区别:
1). 服务器端会阻塞请求直到有数据传递或超时才返回。 2). 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,从新创建链接。 3). 当客户端处理接收的数据、从新创建链接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端从新创建链接,客户端会一次把当前服务器端全部的信息取回。 采用这种方式实现的技术有meboo和pushlet chat。
二、基于iframe及htmlfile流的方式
这个方式和AJAX方式原理相同,只是浏览器一直会显示正在链接状态,gtalk采用htmlfile技术解决了此问题。Zeitoun 网站提供的 comet-iframe.tar.gz,封装了一个基于 iframe 和 htmlfile 的 JavaScript comet 对象,支持 IE、Mozilla Firefox 浏览器,能够做为参考:http://www.zeitoun.net/articles/comet_and_php/start
三、Http长链接的编程原则
1)、不要在同一个客户端开启超过两个的http长链接,这个是受http协议限制的。 2)、控制信息和数据信息使用不一样的http链接。 3)、在客户端和服务器端保持“心跳”信息。
四、Pushlet框架学习
Pushlet框架是用后台采用java实现,前台技术有AJAX和Iframe两种。设计思想采用观察者模式。
3、实现了comet的相关开源框架
pushlet——经过servlet(或者JSP)把JavaScript代码做为HTTP流推送到浏览器。这些代码被浏览器的JavaScript引擎解释并完成一些有趣的工做。因而便轻松地完成了从server端的Java到浏览器中的JavaScript的回调。 dwr cometD 4、Comet实现(Java语言)
1 死循环法
最简单的天然是死循环法,若是使用观察者模式则能够进一步提升性能。
可是这种作法的缺点在于客户端请求了这个servlet后,web服务器会开启一个线程执行servlet的代码,而servlet由迟迟不愿结束,形成该线程也没法被释放。因而乎,一个客户端一个线程,当客户端数量增长时,服务器依然会承受很大的负担。
2 改写web服务器
目前的趋势是从web服务器内部入手,用nio(JDK 1.4提出的java.nio包)改写request/response的实现,再利用线程池加强服务器的资源利用率,从而解决这个问题,目前支持这一非J2EE官方技术的服务器有Glassfish和Jetty。
JDK 1.4版本(包括以后的版本)最显著的新特性就是增长了NIO(New IO),可以以非阻塞的方式处理网络的请求,这就使得在Java中只须要少许的线程就能处理大量的并发请求了。
Jetty 6设计来处理大量并发链接,它使用Java语言的不堵塞I/O(java.nio)库而且使用优化的输出缓冲架构。Jetty也有一个处理长链接的杀手锏:一个称为Continuations的特性。
Grizzly做为GlassFish中很是重要的一个项目,就是用NIO的技术来实现应用服务器中的高性能纯Java的HTTP引擎。Grizzly仍是一个独立于GlassFish的框架结构,能够单独用来扩展和构建本身的服务器软件。
特色:使用NIO不是一件简单的技术,它的一些特色使得编程的模型比原来阻塞的方式更为复杂。
3 使用框架
基于Java的成熟的服务器推送框架有DWR。
DWR是一个开放源码的使用Apache许可协议的解决方案,它包含服务器端Java库、一个DWR servlet以及JavaScript库。虽然DWR不是Java平台上惟一可用的 Ajax-RPC 工具包,可是它是最成熟的,并且提供了许多有用的功能。从最简单的角度来讲,DWR是一个引擎,能够把服务器端Java对象的方法公开给 JavaScript 代码。使用 DWR 能够有效地从应用程序代码中把Ajax的所有请求-响应循环消除掉。这意味着客户端代码不再须要直接处理XMLHttpRequest对象或者服务器的响应。再也不须要编写对象的序列化代码或者使用第三方工具才能把对象变成XML。甚至再也不须要编写servlet代码把Ajax请求调整成对Java域对象的调用。
DWR从2.0开始增长了push功能,也就是在异步传输的状况下能够从Web-Server端发送数据到Browser。
特色:技术成熟,配置简单,DWR与Spring、Struts二、Ext JS都能整合。
参考:
http://zh.wikipedia.org/wiki/Comet_%28web%E6%8A%80%E6%9C%AF%29 Comet技术总结 WEB实时聊天 comet推技术 使用 Java 实现 Comet 风格的 Web 应用