`
xy_z487
  • 浏览: 278334 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

AJAX 长轮询

阅读更多

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wjp553650958/archive/2010/06/24/5692141.aspx

 

基于Web的IM简介:http://www.maycode.com/index.php/hotspot/32-web20/272- webim.html

Ajax轮询以及Comet模式:http://www.blogjava.net/rosen/archive/2009/02/11 /254309.html

基于 HTTP 长连接的“服务器推”技术:http://www.ibm.com/developerworks/cn/web/wa-lo-comet/

claros chat: http://www.claros.org/web/download.do

pushlets: http://www.pushlets.com/
pushlet 原理:http://blog.csdn.net/yxw246/archive/2008/05/08/2418255.aspx


Comet技术的两种实现:基于AJAX长轮询的方式和基于iframe及htmlfile流的方式。

一、基于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两种。设计思想采用观察者模式。

 

 

学习资料:

1. 短轮询(polling) :核心思想是客户端定时去服务器取消息。为了实现即时效果,轮询的间隔必须设计得足够短,另外为了操作的流畅,需要使用Ajax 来发送请求。本人的QGYWebIM 就是采用的此方案。这种方案的优点是:后端程序编写比较容易,发送完响应信息马上断开连接,不会占用太多服务器资源。缺点是一般情况下,频繁的请求中有大半是无用,这些冗余请求无形中浪费了带宽和服务器资源。我们可以通过判断用户的活跃程度来决策请求服务器的间隔,我在 51 的一个帖子提到过这种方法,但是间隔一旦长了,消息的传送就有延时,违背了即时聊天的初衷了。

2. 长轮询(long- polling) :基本原理是客户端向服务器发送请求,服务器接到请求后hold 住连接,直到有新消息才返回响应信息并关闭连接,连接被断开期间用户的新信息会被服务器缓存起来。客户端处理完响应信息后再向服务器发送新的请求。这种做法的优势是如果用户一直没新消息,客户端不会频繁的轮询去服务器取消息,节省了流量,但是服务器维持长连接是很消耗资源的。具体实现起来,前端这边基本不需要什么改动,依然是用Ajax 轮询取信息,后端需要在没有新消息时处理一下。

3. 长连接(streaming) :其实很早以前就有人使用这种技术来实现聊天室的通讯。以前在页面中嵌入一个 iframe ,iframe 里放一个使用长连接页面,服务器有新消息就会及时的在iframe 里反映出来,再依靠客户端的脚本解析出来就OK 了。这样做一个比较严重的问题是:使用iframe 请求长连接时,无论是IE 还是firefox 都会认为页面没有加载完而显示进度条,很难看。不过这个问题是可以解决的。firefox 支持了Streaming Ajax ,在readyState 为3 的时候就能接受数据,所以问题不大;IE 则只能在readyState 为4 ,即连接断开时才能得到返回值。但是伟大的Google 工程师使用了一个hack 成功的解决了这个问题:使用一个被称为“htmlfile ”的ActiveX ,把iframe 放在这个 ActiveX 里就OK 了。

// we were served from child.example.com but
// have already set document.domain to example.com
var currentDomain = "http://exmaple.com/";
var dataStreamUrl = currentDomain+"path/to/server.cgi";
var transferDoc = new ActiveXObject("htmlfile"); // !?!
// make sure it's really scriptable
transferDoc.open();
transferDoc.write("");
transferDoc.write("<script type="text/javascript"><!--
document.domain='"+currentDomain+"';
// --></script>");
transferDoc.write("");
transferDoc.close();
// set the iframe up to call the server for data
var ifrDiv = transferDoc.createElement_x_x("div");
transferDoc.appendChild(ifrDiv);
// start communicating
ifrDiv.innerHTML = "";
无疑,使用长连接对于用户来说是最好的方案,用户体验最好(消息能及时的到达)、占用用户带宽最少(不会发送无用的请求),但是会增加服务器的开销;长轮询是折中方案,Facebook IM 就是采用这种方案,不过做了一点改动:客户端发起的每个连接服务器都hold10S ,这10S 中新消息会源源不断的返回给客户端,10s 后连接关闭,客户端发起下一个连接。这样做是因为Facebook 的用户会不断的打开、关闭新页面,如果每个页面都建立一个永久的长连接,会阻塞浏览器其他请求,服务器也会吃不消的;短轮询因为实现起来简单,适用于小型应用。

http://www.qgy18.com/2008/08/webim-design-transport/


常规来说,有以下方法:

1 。使用JavaApplet 作为中介和服务器交互。不过用户必须为这交互过程编写Java 代码。
2 。使用ActiveX 控件做中介。但是ActiveX 的权限太大,未一定能得到客户信任。
3 。使用IFrame 把某个窗体隐藏,然后用传统的方法进行GET 和POST 。不过请求数据的发送和状态都非常难控制
4 。使用MSXML 的XMLHTTP 来进行数据的传输。这个只适应于Win98 或安装了MSXML(IE6 自带的Windows 系统)
5 。使用dotnet 的Assembly 来写客户端程序。不过这需要客户端安装dotnet 组件。

Lostinet.Janc( 以下称为Janc) 是一个实现和服务器交互的组件。
实际上,它没有提供新的方法来进行和服务器的交互。
它的编写目的就只有一个:为了方便:
要方便代码的编写,要方便程序的发布。。

Lostinet.Janc 采用第4 种方法( 使用Microsoft.XMLHTTP) 和服务器交互。

发表于 @ 2010年06月24日 17:32:00 | 评论( 0 ) | 编辑| 举报| 收藏

旧一篇: Comet:基于 HTTP 长连接的“服务器推”技术(轮询) | 新一篇:Ajax 轮询以及Comet模式—写在Servlet 3.0发布之前
查看最新精华文章 请访问博客首页相关文章

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wjp553650958/archive/2010/06/24/5692141.aspx

分享到:
评论

相关推荐

    php-Ajax长轮询

    长轮询是Ajax的一种变体,主要用于实现实时通信。在传统的Ajax请求中,客户端发送请求到服务器,服务器处理完请求后立即返回响应。而在长轮询中,客户端发送请求后,服务器并不立即响应,而是保持连接打开状态,直到...

    web即时聊天(ajax长轮询方式实现)

    【标题】:“Web即时聊天(Ajax长轮询方式实现)” 在Web开发中,实现即时聊天功能是一项常见的需求,这通常涉及到服务器与客户端之间实时的数据交换。Ajax(Asynchronous JavaScript and XML)技术结合长轮询策略...

    javascript和jQuery实现网页实时聊天的ajax长轮询

    【JavaScript和jQuery实现网页实时聊天的Ajax长轮询】 在Web开发中,为了实现网页的实时聊天功能,我们需要解决HTTP协议无状态、无连接的特点所带来的挑战。传统的HTTP请求是单向且瞬时的,无法满足实时通信的需求...

    jquery与php结合实现AJAX长轮询(LongPoll)

    传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。 反转AJAX...

    PHP+Ajax实现在线聊天长轮询

    本示例“PHP+Ajax实现在线聊天长轮询”旨在教你如何创建一个简单的实时聊天系统,使得用户无需刷新页面就能接收到新消息。 **一、Ajax基础** Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个网页的情况...

    ajaxio:无缝 socket.io 和 ajax 长轮询回退

    AjaxIO 无缝 socket.io 和 ajax 长轮询回退。 AjaxIO 允许在 socket.io 和 ajax 长轮询之间无缝切换,同时维护单个代码库(前端 javascript)。 PS jQuery 不是必需的。设置 &lt;!-- load socket.io - this should ...

    长轮询查看服务器cpu的利用率

    本示例中的“长轮询查看服务器CPU的利用率”是利用Ajax与Struts2框架结合,来实现实时监控服务器CPU使用情况的一个小Demo。下面我们将深入探讨这一技术及其相关知识点。 首先,长轮询是一种模拟双向通信的方法,它...

    talaria:消息库,用于通过websocket进行实时客户端服务器通信,并回退到ajax长轮询

    Talaria通过websocket提供双向通信,并回退到Ajax长轮询。 它在协作原型应用程序生产中运行。 为什么要建造新东西? Precursor需要一些其他库中没有的功能: 服务器发送的消息on-complete回调 这对于施加背压和...

    基于 AJAX和Webservice 的长轮询方式ServerPush技术模拟

    **基于 AJAX 和 Webservice 的长轮询方式 ServerPush 技术模拟** 在现代网页应用中,实时性成为了不可或缺的需求,例如股票更新、聊天室、在线游戏等场景。传统的 HTTP 协议是基于请求-响应模式的,即客户端发起...

    基于推技术的实时网页聊天室

    这种聊天室的实现主要依赖于两种核心技术:Ajax长轮询(Long Polling)和服务器端的推送技术。 1. **Ajax长轮询**:Ajax(Asynchronous JavaScript and XML)是一种在不刷新整个页面的情况下,与服务器交换数据并...

    基于jQuery的Ajax聊天室程序

    在本实例中,可能使用的是Ajax长轮询,即客户端发送请求到服务器,服务器保持连接直到有新的消息,然后立即返回这些消息,客户端接收到后立即清除并再次发起请求,形成持续的循环,模拟实时更新的效果。 6. **用户...

    asp.net+jquery长轮询实例

    ASP.NET与jQuery结合实现的长轮询实例是一个高效的数据实时更新技术,主要用于创建实时交互的Web应用程序。在传统的HTTP协议中,服务器与客户端之间采用的是请求-响应模型,即客户端发送请求,服务器处理请求并返回...

    ajaxessio:具有EventSource和AJAX长轮询回退的无缝Socket.IOWebSocket

    AjaxEsSio AjaxEsSio允许在 ,和之间进行无缝更改,同时保持单个客户端代码库。 不需要jQuery。 该库是的后继者。为什么? 这是个好问题。 如果您可以设置和使用Websocket服务器,则该库可能不适合您。...

    ajax聊天室 PHP ajax聊天室文件版 下载直接可用

    - **WebSocket或轮询**:为了实现即时通讯,除了传统的Ajax长轮询,还可以使用WebSocket建立持久连接,提供更低延迟的双向通信。 - **安全性**:确保用户输入过滤,防止XSS和SQL注入攻击。 - **用户体验**:优化...

    Ajax高级程序设计

    4. **Ajax长轮询与WebSocket**:Ajax长轮询是保持连接直到有新数据时才关闭,WebSocket则是建立持久连接,用于实时通讯应用。 5. **Ajax路由**:单页应用(SPA, Single Page Application)中,使用Ajax实现页面导航...

Global site tag (gtag.js) - Google Analytics