我在javascript中显示了这些显示轮询与长轮询的examples,但我不明白它们之间的区别。特别是关于长轮询示例,它如何保持连接打开?
这就是传统的投票方案:
(function poll(){
setTimeout(function(){
$.ajax({ url: "server", success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
//Setup the next poll recursively
poll();
}, dataType: "json"});
}, 30000);
})();
这是长轮询示例:
(function poll(){
$.ajax({ url: "server", success: function(data){
//Update your dashboard gauge
salesGauge.setValue(data.value);
}, dataType: "json", complete: poll, timeout: 30000 });
})();
谢谢!
答案 0 :(得分:19)
不同之处在于:长轮询允许某种事件驱动的通知,因此服务器能够主动向客户端发送数据。正常轮询是定期检查要获取的数据,可以这么说。维基百科对此非常详细:
通过长轮询,客户端以类似于正常轮询的方式从服务器请求信息;但是,如果服务器没有任何可用于客户端的信息,那么服务器不会发送空响应,而是保留请求并等待信息变为可用(或者对于合适的超时事件),之后完整的响应是终于送到了客户端。
长轮询减少了需要发送的数据量,因为服务器仅在存在IS数据时才发送数据,因此客户端不需要在每个间隔x检查。
如果您需要更高性能(并且更优雅)的全双工客户端/服务器通信方式,请考虑使用WebSocket协议,这很棒!
答案 1 :(得分:2)
对于轮询,客户端通常会以固定的间隔从服务器请求数据,并且服务器将以最新状态响应或根本不响应。轮询的主要问题是客户端不知道何时请求数据。这通常会导致对数据的请求,该数据自上次请求以来实际上并未真正更改过,或者在初始更改后过一会儿才请求数据。两种情况都不理想。
对于long polling,请求会像轮询中一样发送到服务器,但是不会立即收到响应。而是,服务器可以等待数据已更改,然后发送响应。这样既可以确保不会不必要地发送请求,也可以确保客户端在更改后尽快获取数据。