- 浏览: 14097 次
最新评论
AJAX 长轮询
2010年06月24日
基于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-co met/
claros chat: http://www.claros.org/web/download.do
pushlets: http://www.pushlets.com/
pushlet 原理:http://blog.csdn.net/yxw246/archive/2008/05/08/241 8255.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/star t
三、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("document.domain='"+currentDomain+"';
// -->");
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-transpor t/
常规来说,有以下方法:
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) 和服务器交互。
发表评论
-
Comet基于iframe的服务器推送(Server Push)例子
2012-01-20 10:51 609Comet基于iframe的服务器推送(Server Push ... -
AJAX(XMLHttpRequest)进行跨域请求方法详解
2012-01-20 10:50 1148AJAX(XMLHttpRequest)进行跨 ... -
解决js跨域问题
2012-01-20 10:50 562解决js跨域问题 2011年03月14日 解决js跨域问 ... -
JS 报错 没有权限
2012-01-20 10:50 618JS 报错 没有权限 2010年12月13日 没有权限是 ... -
win7安vc2008编译报link : fatal error lnk1000: internal error during incrbuildimage_竹林英客
2012-01-19 15:49 554win7安vc2008编译报link : fatal erro ... -
LOG_ERROR::Permission denied (13) in chk_file_sec
2012-01-19 15:49 2069LOG_ERROR::Permission denied (1 ... -
mysql远程无法登陆出现ERROR 2003 (HY000)...解决方法
2012-01-19 15:49 786mysql远程无法登陆出现ERROR 2003 (HY000) ... -
LOL NSIS Error
2012-01-19 15:49 1276LOL NSIS Error 2011年06月06日 出 ... -
转:错误处理(Error-Handling):为何、何时、如何(rev#2)
2012-01-19 15:49 627转:错误处理(Error-Handling ... -
虚伪的友情再见!!!!
2012-01-17 05:31 578虚伪的友情再见!!!! 2011 ... -
好时光,是美人
2012-01-17 05:31 451好时光,是美人 2011年11月26日 ... -
第一言:曹操
2012-01-17 05:31 688第一言:曹操 2011年11月26日 文章出处:http ... -
武林秘籍――《骂人宝典》
2012-01-17 05:31 781武林秘籍――《骂人宝 ... -
变身-室友跳楼的诡异事件
2012-01-17 05:30 888变身-室友跳楼的诡异事 ... -
2011-12-22
2012-01-16 04:27 4322011-12-22 2011年12月22日 室内设计原 ... -
远古的孔加工工具(转)
2012-01-16 04:27 507远古的孔加工工具(转) ... -
孔子的政治思想
2012-01-16 04:26 623孔子的政治思想 2011年11月27日 孔子是中国政治思 ...
相关推荐
php-Ajax长轮询的简单实例,适用于对实时性要求较高的数据,如聊天室,客服系统等
Ajax轮询,Ajax长轮询和websocket.docx
采用ajax+长轮询,简单易懂.实现web对话即时推送。欢迎下载!
传统的AJAX轮询方式,客服端以用户定义的时间间隔去服务器上查询最新的数据。种这种拉取数据的方式需要很短的时间间隔才能保证数据的精确度,但太短的时间间隔客服端会对服务器在短时间内发送出多个请求。 反转AJAX...
PHP+Ajax实现在线聊天长轮询,有需要的小伙伴可以看下,相互学习
AjaxIO 无缝 socket.io 和 ajax 长轮询回退。 AjaxIO 允许在 socket.io 和 ajax 长轮询之间无缝切换,同时维护单个代码库(前端 javascript)。 PS jQuery 不是必需的。设置 <!-- load socket.io - this should ...
主要给大家介绍了关于Thinkphp结合AJAX长轮询实现PC与APP推送的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
Talaria通过websocket提供双向通信,并回退到Ajax长轮询。 它在协作原型应用程序生产中运行。 为什么要建造新东西? Precursor需要一些其他库中没有的功能: 服务器发送的消息on-complete回调 这对于施加背压和...
介绍 ... 1、支持客户/服务器模式; 2、简单快速; 3、灵活;...所以一次的请求都是一个单独的事件,和前后都没有联系。所以我们在解决网页实时聊天时就遇到一个问题,如何保证与服务器的长时间联系,...3、轮询,顾名思义就是
AJAX和Webservice 的长轮询方式ServerPush模拟 vs2005、ASPAJAXExtSetup.msi、ASPAJAXCTP.msi
AjaxEsSio AjaxEsSio允许在 ,和之间进行无缝更改,同时保持单个客户端代码库。 不需要jQuery。 该库是的后继者。为什么? 这是个好问题。 如果您可以设置和使用Websocket服务器,则该库可能不适合您。...
该Demo是一个简单的通过ajax+struts2写的长轮询,通过服务器得到新的数据,直接推送给浏览器的小Demo,希望大家相互学习
使用Ext进度条界面,vs2005+Ajax异步轮询,真正显示服务器的进度。
ajax长轮询实现的网页实时聊天室,用到了springMVC、extjs、fckeditor等。代码是自己写的,写的有点随心所欲,凑合看吧。如果感兴趣可以发私信,一起讨论。
该工程基于Ajax技术,采用客户端轮询服务器实现即时通信的简单Demo。 其中,com.gis.lp.webim.CClient作为主要的服务器端类,实现对信息的存储以及插入和读取:客户端发送的新信息通过该类的insertNews方法,将信息...
二:ajax持久连接 + 长轮询 客服端采用第一种方式:iframe + 服务器推技术 思路: 1:新建comentbyiframe.php 该用文件使用while(true)一直连接到服务器不断开. 如果在while的过程中查到了新数据.使用ob_flush推给...
资源概要:基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性。...然后通过iframe和ajax方式分别程序设计实现长连接、长轮询。