两个轮询之间的长轮询客户端“时间间隔”

Posted

技术标签:

【中文标题】两个轮询之间的长轮询客户端“时间间隔”【英文标题】:Long Polling client-side "Time Gap" Between 2 Pollings 【发布时间】:2013-01-28 18:10:02 【问题描述】:

假设我有一个服务器支持客户端长轮询。 那么我的客户端代码是这样的:

var polling = function() 
    $.ajax(
        url: "/polling"
    ).done(function(data) 
        // polling again
        polling();
        // process the pushed data
        ...
    );

polling();

当我想在客户端不断轮询“/polling”时向客户端推送一些东西时,这应该可以工作。

但是,您可能会注意到客户端收到推送数据和下一次轮询到达服务器之间存在“时间间隔”。在这个“时间间隔”中的数据将会丢失。

有多种服务器端解决方法可以避免此问题。 但我想知道客户端是否有任何解决方法? 如: * 客户端能否保持长轮询请求始终连接?我发现 Gmail 应该做一些这样的技巧。我在 gtalk 中聊天,但没有看到“/bind”请求中断。 * ajax 是否应该在传输时接收到不完整的数据?然后连接可以永远连接。 * websocket 应该工作吗?如果是这样,没有 html5 我该怎么办?

【问题讨论】:

嗯,你为什么会有时间间隔?您的会话不应该请求知道上次返回信息的时间吗? @epascarello,是的,服务器知道上次轮询的时间。但是,当服务器在 2 次轮询的间隙中有要推送的内容时,服务器应该在随后的轮询到达时缓存/保留数据一段时间。但如果没有间隙,服务器就不需要缓存。 【参考方案1】:

您可能想要考虑像Pusher 这样的东西,它会让您在处理此类事情时变得更轻松(因为它们为您提供了一个库来处理所有这些在一个不错的包中)。

【讨论】:

以上是关于两个轮询之间的长轮询客户端“时间间隔”的主要内容,如果未能解决你的问题,请参考以下文章

Node.js:这个长轮询实现是不是泄漏:

[开发技巧]利用openresty来优化php-fpm的长轮询

Gevent的长轮询实现方法详解

普通 ajax 和长轮询之间的区别

使用 ReactPHP 异步的长轮询电报

web通讯长连接与长轮询