2011-10-12 48 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 –

相關問題