我真的不明白“ajax push”是怎么回事。我知道长轮询,我认为它是一样的。
长轮询的缺点是您的服务器可能会打开许多未完成的请求。不是套接字,而是实际请求。长轮询的想法:
- 客户端向服务器发出请求
- 服务器没有响应(没有完成请求)
- 服务器等到有东西要告诉(给客户端)
- 当服务器接收到新信息(来自另一个客户端或其他地方)时,它会将该信息打印给所有等待的客户端(可能很多!)并完成请求
- 客户端收到该信息并立即发出另一个请求(使用新的时间戳和/或哈希等)
缺点:如果 500 个客户端都执行第 1 步而没有其他任何操作,则服务器打开了 500 个请求,只是在等待发送一些信息并结束这些请求。大多数服务器不允许 500 个打开的 HTTP 请求...
如果您有时间,您可能想阅读此 PDF。(虽然很长。)
PS。好处是您的服务器接收的 HTTP 请求更少(这意味着更少的 HTTP 开销),并且只有在有东西要发送时才会发送该信息(这也意味着更少的开销)。
编辑
长轮询示例:http ://hotblocks.nl/tests/ajax/poller/与源http://hotblocks.nl/tests/ajax/poller/callback.php?source
解释
好处:更少的 HTTP 开销,因为更少的 HTTP 请求。假设用户数量是静态的(它是)和 500。
使用长轮询:500 个用户发出 1 个请求,然后等待............然后发生变化,所有 500 个请求都完成(由服务器),然后由“更新”(新的 HTTP 请求)客户端。
好处:更少的请求(每个用户每个新信息 1 个)。
缺点:更长的请求(很长的空闲,这意味着更多的开放请求)。
没有长轮询:500 个用户发出请求,服务器以“nothing new”响应,因此 500 个用户在 500ms/1s/5s 后发出另一个请求,服务器再次以“nothing new”等响应,等等,直到服务器有实际消息和然后响应包含一些东西。即使这样,客户也会立即提出新的请求。
优点:对服务器的快速、简短的请求可以快速完成。
缺点:对服务器的请求很多很多(以及每个 HTTP 请求 => HTTP 标头 => 大量开销)。
示例说明
该示例非常(非常)简单:
- 您(客户端)向服务器发出请求以获取当前信息
- 服务器为您提供该信息和时间戳
- 客户端接收信息,使用它(显示消息)并使用时间戳发出新请求
- 服务器将客户端时间戳与服务器时间戳(
filemtime
在这种情况下为文件)进行比较
- 如果文件更改比客户端时间戳更新:打印新文件内容
- 客户端收到该信息和新的服务器时间戳
- 再次进行第 3 步等
第 4 步和第 5 步之间的时间可能很长。在活跃的聊天中,它不会。(新信息一直在添加。)在多人游戏中,它可能是(秒,而不是分钟)。