关于即时聊天的comet,服务器推的实现策略

HTTP协议是互联网上大量信息交换的基础,其特点是,它是基于请求—响应模式的无状态的单向协议,即必须由客户端发起一个请求建立连接,服务器接收请求,把数据返回给客户端,然后释放连接。下一次,再由客户端发起另一次请求,重复上述过程。服务器始终处于“被动”地位。

Comet技术被称为反AJAX(Reverse AJAX)技术,它通过实现服务器推(server push)来解决AJAX需要定时频繁发送请求的问题。通过Comet,客户端所需要的响应信息不再需要主动地去索取,而是在服务器端以事件 (Event)的形式推至客户端。


Comet技术的实现方式有两种:基于 AJAX 的长轮询(long-polling)方式(long-polling)和流方式(streaming)。

长轮询:HTTP的连接保持,服务器端会阻塞请求,直到服务器端有一个事件触发或者到达超时。客户端在收到响应后再次发出请求,重新建立连接。通过这种方式,服务器可以在数据可用的任何时候将数据“推”到客户端。因为这种方案基于AJAX,请求异步发出,无须安装插件,IE、Mozilla FireFox都支持。

使用 AJAX 实现“服务器推”与传统的 AJAX 应用不同之处在于:
- 服务器端会阻塞请求直到有数据传递或超时才返回。

- 客户端 JavaScript 响应处理函数会在处理完服务器返回的信息后,再次发出请求,重新建立连接。
- 当客户端处理接收的数据、重新建立连接时,服务器端可能有新的数据到达;这些信息会被服务器端保存直到客户端重新建立连接,客户端会一次把当前服务器端所有的信息取回。

流方式:在流方式中,服务器推数据返回客户端,但不关闭连接,连接始终保持,直到超时,超时后通知客户端重新建立连接,并关闭原来的连接。

在长轮询方式下,客户端是在XMLHttpRequest的readystate为4(即数据传输结束)时调用回调函数,进行信息处理。当 readystate为4时,数据传输结束,连接已经关闭。Mozilla Firefox提供了对流方式的支持,即readystate为3时(数据仍在传输中),客户端可以读取数据,从而无须关闭连接,就能读取处理服务器端返回的信息。IE在readystate为3时,不能读取服务器返回的数据,目前IE不支持流方式。

猜你喜欢

转载自wz510541136.iteye.com/blog/1821369