我试图了解Facebook的聊天功能如何在不持续轮询服务器的情况下接收消息。
Firebug向我展示了一个GET XmlHttpRequest,它一直坐在那里,等待服务器的响应。5分钟后,此操作永不超时。
他们如何防止超时?
AJAX请求可以无限期地呆在那里,等待响应吗?
我可以使用JSONRequest吗?我在json.org上看到了这一点:
JSONRequest旨在支持双工连接。这允许服务器可以在其中异步启动传输的应用程序。这是通过同时使用两个请求来完成的:一个发送请求,另一个请求接收。通过使用timeout参数,可以使POST请求处于待处理状态,直到服务器确定它有及时的数据要发送为止。
或者,除了使用JSONRequest之外,还有另一种方法让AJAX呼叫就在那儿等待吗?
Facebook使用一种现在称为Comet的技术将消息从服务器推送到客户端,而不是让客户端轮询服务器。
有多种方法可以实现,XMLHttpRequest长轮询只是一种选择。该方法背后的原理是,客户端发送一个普通的XMLHttpRequest,但是服务器直到某个事件发生(例如另一个用户发送一条消息)时才响应,因此客户端被迫等待。当客户端收到响应(或请求超时)时,客户端仅创建一个新请求,以使该服务器始终有一个打开的请求。