Comet 实现的方法

原创 2011年01月19日 12:03:00

Comet 实现的方法

  • 简单轮询

    最早期的 Web 应用中,主要通过 JavaScript 或者 Meta HTML 标签等手段,定时刷新页面来检测服务端的变化。显然定时刷新页面服务端仍然在被动响应客户端的请求,只不过客户端的请求是连续、频繁的,让用户看起来产生 有服务端自动将信息发过来的错觉。这种方式简单易行,但缺陷也非常明显:可能大部分请求都是无意义的,因为服务端期待的事件没有发生,实际上并没有需要发 送的信息,而不得不重复的回应着页面上所有内容给浏览器;另外就是当服务端发生变化时,并不能“实时”的返回,刷新的间隔太短,产生很大的性能浪费,间隔 太长,事件通知又可能晚于用户期望的时间到达。

    当绝大部分浏览器提供了 XHR(XmlHttpRequest)对象支持后,Ajax 技术出现并迅速流行,这一阶段做的轮询就不必每次都返回都返回整个页面中所有的内容,如果服务端没有事件产生,只需要返回极少量内容的 http 报文体。Ajax 可以节省轮询传输中大量的带宽浪费,但它无法减少请求的次数,因此 Ajax 实现的简单轮询仍然有轮询的局限性,对其缺陷只能一定程度缓解,而无法达到质变。

  • 长轮询(混合轮询)

    长轮询与简单轮询的最大区别就是连接时间的长短:简单轮询时当页面输出完连接就关闭了,而长轮询一般会保持 30 秒乃至更长时间,当服务器上期待的事件发生,将会立刻输出事件通知到客户端,接着关闭连接,同时建立下一个连接开始一次新的长轮询。

    长轮询的实现方式优势在于当服务端期待事件发生,数据便立即返回到客户端,期间没有数据返回,再较长的等待时间内也没有新的请求发生,这 样可以让发送的请求减少很多,而事件通知的灵敏度却大幅提高到几乎是“实时”的程度。

  • Comet 流(Forever Frame)

    Comet 流是按照长轮询的实现思路进一步发展的产物。令长轮询将事件通知发送回客户端后不再关闭连接,而是一直保持直到超时事件发生才重新建立新的连接,这种变体 我们就称为 Comet 流。客户端可以使用 XmlHttpRequest 对象中的 readyState 属性来判断是 Receiving 还是 Loaded。Comet 流理论上可以使用一个链接来处理若干次服务端事件通知,更进一步节省了发送到服务端的请求次数。

无论是长轮询还是 Comet 流,在服务端和客户端都需要维持一个比较长时间的连接状态,这一点在客户端不算什么太大的负担,但是服务端是要同时对多个客户端服务的,按照经典 Request-Response 交互模型,每一个请求都占用一个 Web 线程不释放的话,Web 容器的线程则会很快消耗殆尽,而这些线程大部分时间处于空闲等待的状态。这也就是为什么 Comet 风格服务非常期待异步处理的原因,希望 Web 线程不需要同步的、一对一的处理客户端请求,能做到一个 Web 线程处理多个客户端请求。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

浏览器 和 服务器端长连接的实现方法 (Polling, Comet, Long Polling, WebSocket)

转自:http://www.josephj.com/entry.php?id=358   對 Comet 的懵懂 記得兩年多前,第一次看到 Gmail 中的 GTalk 覺得很好奇:「咦?線上聊...

comet4j使用方法

  • 2014-10-16 14:01
  • 24KB
  • 下载

DWR+Comet完整实现

  • 2010-08-03 22:20
  • 71KB
  • 下载

“服务器推”之Iframe配合comet实现

首先,通过tomcat的comet来实现服务器推的技术要在tomcat的Server.xml文件中修改一下设置: 将普通情况的 改为: 其次,服务器端使用实现了org.apach...

Spring整合DWR comet 实现无刷新 多人聊天室

Spring整合DWR comet 实现无刷新 多人聊天室 用dwr的comet(推)来实现简单的无刷新多人聊天室,comet是长连接的一种。通常我们要实现无刷新,一般会使用到Ajax。Ajax 应...

nginx轻松实现comet服务器推

前不久偶尔发现nginx一个实现服务器推的模块NGiNX_HTTP_Push_Module,尝试了一下,可以轻松实现服务器推,而且由于nginx服务器自身是采用事件驱动而非线程模型提供服务,可以保证高...
  • ciaos
  • ciaos
  • 2012-04-24 09:01
  • 6164

DWR3.0+Spring2.5实现Comet服务器到浏览器的消息推送

网上找到不少相关例子,不过大部分是dwr2的例子,效果一般,研究了一下dwr3.0相关内容,做了个DEMO,实现了向一个或多个精确目标推送内容。重点在于向ScriptSessionManager中加入...

【转载】使用 Java 实现 Comet 风格的 Web 应用

开始 在本文中,我将展示如何使用各种不同的 Java 技术构建一些简单的 Comet 风格的 Web 应用程序。读者对 Java servlet、Ajax 和 JavaScript 应该有一定的了解...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)