2011-10-12 189 views
2

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

我复制从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。

出了什么问题?

回答

1

首先,您两次提到onclose事件,然后发布代码以侦听close事件。有些人在看到像这样的东西时会跳过你的问题。其次,TCP连接是操作系统代表应用程序管理的东西。根据你如何建立和断开一个连接,TCP连接完全可能在你认为已经损坏了几分钟后才会持续存在。做一些关于TCP,socket和流连的研究。

+1

我描述了我建立和断开连接的方式 - 只需在浏览器中用nodejs URL打开页面,然后单击“停止”按钮。这是很常见的方式,不是吗? 我也知道,大部分在线聊天应用程序(如GMail中的聊天记录)都可以理解用户在关闭长轮询连接后才离线。如果我使用与我的例子相同的操作系统和浏览器,他们如何做? – alevkon

+0

单击停止按钮时,要知道浏览器做什么的唯一方法是阅读浏览器源代码,或使用Wireshark并观察网络流量。仅仅对TCP编程最佳实践进行一些研究就容易多了。像这样的东西http://msdn.microsoft.com/en-us/library/windows/desktop/ms738547(v=vs.85).aspx和这个http://fixunix.com/unix/526177-how-fast -close-socket.html –