Javascript:每个客户端有两个连接?

时间:2011-12-12 09:01:54

标签: javascript ajax multitasking long-polling heartbeat

我正在开发一个实现longpolling的应用程序,因为我希望用户在收到通知后立即收到通知。我有这个部分工作,但我还需要使用javascript函数扩展它,每20秒向服务器发送一次“心跳”。

我的问题:如何在不完全中断代码20秒的情况下执行此操作(以便其他javascript在计数时仍然执行)并且是否有某种方法可以使用第二个连接?因为当心跳发送给用户时,我不希望我的longpolling被中断。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

虽然下面的帖子很旧,但它表明浏览器在任何时候都允许通过XMLHttpRequest进行多个连接。

How many concurrent AJAX (XmlHttpRequest) requests are allowed in popular browsers?

如果你有一个使用XMLHttpRequest或任何其他实现comet的方法的长轮询会话,你仍然可以创建另一个请求到同一服务器作为setInterval或setTimeout函数的一部分,直到你达到浏览器强加的有限限制,您需要确保的是在XHR的构造中包含异步标志:

var heartbeatXhr = new XMLHttpRequest();
heartbeatXhr.open('GET', '/polling-url', true); // true for asynchronous

答案 1 :(得分:4)

使用setInterval(yourHearbeatFunction, 20000),它不会锁定Javascript执行线程。因此,longpolled请求将在它到来时立即处理。

答案 2 :(得分:1)

您无需为要实现的目标维护多个连接。 Javascript的异步特性允许连接在处理其他事物时保持活跃。您可能认为javascript的XHR是阻塞的,因为它是单线程的。

由于事件循环模型,javascript中的XHR是非阻塞的 - javascript引擎始终处于循环中,检查已注册的调用是否已完成以及是否应处理其回调。这允许其操作是非阻塞的,从而允许单个javascript应用程序处理多个XHR长轮询请求。

如果你能够为请求使用jQuery,它可以很好地使用这个函数包装XHR:http://api.jquery.com/jQuery.ajax/。这样,您可以定义20秒的超时并立即处理(重新启动与服务器的连接)。

除此之外 - 您可能希望考虑使用服务器堆栈来优化长轮询。确保您的Web服务器不会为每个请求生成一个线程(如Apache 2.2) - 否则您将很快耗尽系统资源!如果你可以使用node.js(非常适合处理许多同时发出的请求),请将socket.io库作为服务器端和客户端解决方案(http://socket.io/#home).