【问题标题】:request.close event doesn't fire in node.js serverrequest.close 事件不会在 node.js 服务器中触发
【发布时间】:2011-10-12 05:49:35
【问题描述】:

我正在开发使用 node.js 作为服务器的长轮询应用程序。具体任务是立即学习,然后用户下线。所以,我必须监听 request.close 事件,对吧?

我从How to check if connection was aborted in node.js server复制了以下代码

var http = require("http"),
    util = require("util");

var httpServer = http.createServer(function(req, res) {
    util.log("new request...");

    // notify me when client connection is lost
    req.on("close", function(err) {
        util.log("request closed...");
    });

    // wait with response for 15 seconds
    setTimeout(function() {
        res.writeHead(200, {'Content-Type': 'text/plain'});
        res.write("response");
        res.end();

        util.log("response sent...");
    }, 15000);
});
httpServer.listen(8888, "127.0.0.1");
util.log("Running on 8888");

我无法让它正常工作:

  1. 我在浏览器中打开与 node.js 服务器连接的特定 URL

  2. 然后立即单击“停止”按钮。

  3. Node.js 等待 15 秒,就好像连接仍然存在一样, 然后记录“已发送响应”。

我关闭了 nginx 以防止出现任何问题,结果是一样的。我也尝试听 req.connection.on("close") 事件,结果还是一样。 nodejs 版本是 0.4.12。

可能出了什么问题?

【问题讨论】:

    标签: http node.js long-polling


    【解决方案1】:

    首先,您两次提到了onclose 事件,然后发布了侦听close 事件的代码。有些人看到这样的内容时会跳过你的问题。

    其次,TCP 连接是操作系统代表应用程序管理的东西。根据您建立和断开连接的方式,TCP 连接完全有可能在您认为断开连接后停留几分钟。对 TCP、socket 和 linger 做一些研究。

    【讨论】:

    • 我描述了建立和断开连接的方式 - 我只需在浏览器中打开带有 nodejs URL 的页面,然后单击停止按钮。这是很常见的方式,不是吗?我还知道,大多数在线聊天应用程序(例如 GMail 中的聊天)都可以理解用户在关闭长轮询连接后立即下线。如果我使用与我的示例相同的操作系统和浏览器,他们是如何做到的?
    • 在单击停止按钮时了解浏览器执行的唯一方法是阅读浏览器源代码,或者使用 Wireshark 并观察网络流量。对 TCP 编程最佳实践进行一些研究要容易得多。像这样的东西msdn.microsoft.com/en-us/library/windows/desktop/… 和这个fixunix.com/unix/526177-how-fast-close-socket.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多