[转]AJAX开发之通讯模式介绍

HTTP是无连接的,HTTP通讯过程基本就是:客户端发送请求给服务器,服务器接收请求给出响应信息,客户端接收响应信息显示在用户的显示器上,客户端断开连接。由此可知,要实现即时聊天中的”即时”,我们有两个办法:服务器抓住连接不断开和客户端不断的向服务器发起请求实现伪即时。当然用 Flash XMLSocket可以实现真正的即时通讯,但这样已经不是使用HTTP协议了,HTTP天生的优势(无需另外开端口、自动穿越防火墙)也就无法体现。

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(““);
transferDoc.write(“”);
transferDoc.close();
// set the iframe up to call the server for data
var ifrDiv = transferDoc.createElement(“div”);
transferDoc.appendChild(ifrDiv);
// start communicating
ifrDiv.innerHTML = “”;

复制代码
无疑,使用长连接对于用户来说是最好的方案,用户体验最好(消息能及时的到达)、占用用户带宽最少(不会发送无用的请求),但是会增加服务器的开销;长轮询是折中方案,Facebook IM 就是采用这种方案,不过做了一点改动:客户端发起的每个连接服务器都hold10S,这10S中新消息会源源不断的返回给客户端,10s后连接关闭,客户端发起下一个连接。这样做是因为Facebook的用户会不断的打开、关闭新页面,如果每个页面都建立一个永久的长连接,会阻塞浏览器其他请求,服务器也会吃不消的;短轮询因为实现起来简单,适用于小型应用。

转自:

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

本文固定链接: http://fatjames.extjs.org.cn/archives/341 | 吴小强的博客

该日志由 Xiaoqiang.Wu 于2009年09月16日发表在 Web UI 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: [转]AJAX开发之通讯模式介绍 | 吴小强的博客

[转]AJAX开发之通讯模式介绍:目前有1 条留言

  1. 沙发
    泉州房产:

    服务器抓住连接不断开和客户端不断的向服务器发起请求实现伪即时。如何理解伪即时?

    2009-10-08 11:11 上午 [回复]

发表评论

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

快捷键:Ctrl+Enter