comet的介绍:Comet 有时也称反向 Ajax 或服务器端推技术( server-side push )。其思想很简单:将数据直接从服务器推到浏览器,而不必等到浏览器请求数据。听起来简单,但是如果熟悉 Web 应用程序,尤其是 HTTP 协议,那么您就会知道,这绝不简单。实现 Comet 风格的 Web 应用程序,同时保证在浏览器和服务器上的可伸缩性,这只是在最近几年才成为可能。目前一些主流网站都有类似的原理,例如: webQQ 、开心网、校内等等,它们中消息动态都是采用类似的技术,只是具体实现方式不一样。
COMET 的精髓就在于用服务器与 javascript 来维持浏览器的长连接,同时完成服务器端事件的浏览器端响应。这样的事件广播机制是跨网络的,同时也是实时的。
采用了 Comet 技术的服务器在客户机做出一个请求后,和客户机建立一个永久的连接,然后服务器会根据客户机的请求不断把数据包推向客户,这个推的过程是不间断的。由服务器推向客户机的数据在客户机的浏览器上会不断产生新的内容,而且不会产生 Client pull 那样的 HTML 文档头,从而大大减少了延迟的时间,向(服务器响应 -- 客户机请求)同步迈进了一步。
服务器推送通常效率要比客户端拖曳效率高,因为它不必为后续数据建立新的连接。由于始终保持连接,即使没有数据传输时也是这样,因此服务器必须愿意分配这些 TCP/IP 端口,对于 TCP/IP 端口数有限的服务器这将是一个严重的问题。
客户端拖曳效率低,因为这必须每次为传送数据建立新的连接。但是它不必始终保持连接。在实际情况中,建立 HTTP 连接通常需要花费相当多的时间,多达一秒甚至更多。因此从性能上考虑,服务器推送对于最终用户更有吸引力,特别是对于需要经常更新信息的情况下。
服务器推送相对客户端拖曳的另一点优势是,服务器推送相对比较容易控制。例如,服务器每一次推送时都保持一个连接,但它又随时可以关闭其中的任何连接,而不需要在服务器上设置特殊的算法。而客户端拖曳在同样的情况下要麻烦许多,它每次要与服务器建立连接,服务器为了处理将客户端拖曳请求与特定的最终用户匹配等情况,需要使用相当麻烦的算法。
如上所述,在服务器推送中,多个响应中连接始终保持,使服务器可在任何时间发送更多的数据。一个明显的好处是服务器完全能够控制更新数据的时间和频率。另外,这种方法效率高,因为始终保持连接。缺点是保持连接状态会浪费服务器端的资源。服务器推送还比较容易中断。
如果谈到comet的实现,我想应该有死循环法,改写web服务器,和使用框架
下面是我所参考的一些资料
其实实现comet,已经有很多开源的框架了,详情请参考这里;
像apahe的jetty项目内部就有comet的例子,想看效果的朋友可以去下载看看,只是jetty主要是介于Continuations特性的
在comet的开源框架中,我选择了pushelt,现在的版本好像是2.0.4,主要是使用了观察者模型。浏览器端提供了基于 AJAX 和 iframe 的 JavaScript 库,服务器端使用 Java Servlet。
其实dwr框架也可以实现服务器推送的技术,在此不具体讲解了;