【问题标题】:Long Polling for more than 1 connection in same browser在同一浏览器中对超过 1 个连接进行长轮询
【发布时间】:2012-07-06 20:43:30
【问题描述】:

我正在尝试使用 NodeJS 实现长轮询技术。

我在服务器上部署了这个基本代码。

http = require('http');

function onRequest(request, response) {
    console.log('onRequest reached');
}

http.createServer(onRequest).listen(8080);
console.log('Server has started.');

当请求 localhost:8080 时,会触发 onRequest。当此连接处于活动状态时,我在第二个选项卡中请求同一页面,但不会触发 onRequest。但是,从另一个浏览器请求同一页面会触发 onRequest,而第一个连接仍处于“长轮询”状态。

浏览器有什么限制吗?这是如何以及为什么会发生的?如何避免这种情况?

顺便说一句。我正在尝试实现长轮询聊天和通知系统。实际上请求应该通过 AJAX 调用。

【问题讨论】:

    标签: node.js comet long-polling


    【解决方案1】:

    可能是浏览器正在等待响应。立即尝试仅发送标头:

    function onRequest(request, response) {
        response.writeHead(200, {'Content-Type': 'text/html'});
        console.log('onRequest reached');
    }
    

    另一个提示:如果您要使用长轮询,我建议您查看Server-Sent Events。对此有相当广泛的浏览器支持,还有一个用于旧浏览器的polyfill。这是一个example in CoffeeScript,展示了如何从 node.js 服务器发送事件。

    【讨论】:

    • 立即发送标头没有帮助。
    • 好的。事情是这样的:根据 HTTP/1.1 规范,浏览器最多只能同时打开 2 个到同一服务器的连接。我不确定您的问题是否来自请求//favicon.ico 的第一个窗口,或者其他什么...无论如何,长轮询是一个很大的缺点。
    • 哦。我还阅读了大约 2 个连接限制。但是忘了 /favicon.ico :) 现在我需要避免这种情况的方法。 Facebook 与他的聊天是什么?
    • 我猜 Facebook 使用 WebSockets,有后备。如果你想要这样更健壮的东西,你可以查看非常流行的socket.io 模块。它以简洁的界面为您提供 WebSockets、长轮询、FlashSocket、iframe 轮询。不过,我仍然认为您应该研究 Server-Sent Events,因为它更简单,具有更好的浏览器支持。但是,取决于用例,因为 SSE 只是服务器 -> 浏览器。
    • 如果您需要一个在浏览器的多个选项卡上自动共享和多路复用同一连接的系统,请查看 Lightstreamer。要查看此行为的实时演示,请转到聊天启动页面 (lightstreamer.com/demos#ChatDemo),然后多次单击“运行演示”。
    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多