XHR持久连接,怎么回事?

时间:2009-12-03 04:33:50

标签: javascript xmlhttprequest comet

我只是在阅读FaceBook如何设计他们的聊天系统,它的内容如下: “并且让iframe的JavaScript通过持久连接发出HTTP GET请求,直到服务器为客户端提供数据时才会返回。如果请求被中断或超时,请求会重新建立。这绝不是一种新技术:它是Comet的变体,特别是XHR长轮询和/或BOSH。“

有人可以解释如何对Web服务器发出持久请求吗?

2 个答案:

答案 0 :(得分:2)

看看this page。我已经进行了长时间的民意测验。基本上它与服务器的普通XmlHTTP请求(XHR,post或get)不同。它是保持连接打开的服务器,客户端(浏览器)只是等待响应。虽然服务器没有关闭连接(readyState< 4),但您可以对响应执行某些操作。如果连接已关闭(readyState 4),则XHR将重新启动。

On this location您可以找到一个非常基本且不完整的实验(仅适用于Firefox ),其中服务器以随机间隔发送RGB元组一段时间。连续readyState的问题< 4正在读出最后发送的值,因为您无法判断最后一个响应块何时完成。好吧,它可能会让你知道可以完成它。

答案 1 :(得分:2)

基本上,你只是在服务器上持有请求,直到1)有可用数据或2)服务器达到阈值并说“忘记它,重新建立所以我知道你真的还在那里”。这种方法的难点在于服务器端的可扩展性,因为通常Web服务器设计为尽可能快地执行,并且很难为传入的“长期”请求产生大量线程/进程。

这个长期持有的请求通常是Xhr(如果在同一个域中),或者是JSONP(如果是跨域)。

我们已经为我们的IIS / ASP.NET Comet服务器(WebSync)编写了一个完整的彗星客户端,您可以查看并获得一个想法。浏览client.js file的源代码(发送?debug = true以查看未压缩的版本),您将看到一些对“连接”请求的引用 - 这些是对服务器的长轮询请求,等待假设没有数据到达,每个请求约25秒。