TCP服务器没有关闭,nodeJS

时间:2012-12-16 08:47:02

标签: node.js tcp tcplistener

我试图在close() TCP服务器上调用nodeJS,但似乎没有发生。这是我的代码

var net = require('net');

var server = net.createServer(function(){console.log("SERVER CREATED")});

server.listen(4000,function(){console.log("SERVER LISTENING")});

setTimeout(function () {
            console.log(">>> CLOSING ");
            server.close(function () {console.log("CLOSED!!")});
        }, 2000);


setTimeout(function () {
            console.log(">>> TEST TIMED OUT!!! ");
            process.exit(1);
        }, 2000);

我使用计时器来确保服务器有足够的时间来调用回调函数。它很奇怪,但我得到的唯一输出是

SERVER LISTENING
>>> CLOSING 
>>> TEST TIMED OUT!!! 

任何想法为什么?是关闭调用,但不知何故没有输出任何东西?

1 个答案:

答案 0 :(得分:2)

我运行了你的代码,它确实很有意义。如果您在流程退出时增加超时,它将按预期工作。

Node是单线程的,因此一次只执行一件事。它还按照链接到它们的事件的顺序调用回调。

我重写了你的测试,以便更容易解释顺序:

var net = require('net'),
    serverCreated = function(){console.log("SERVER CREATED")},
    serverListening = function(){console.log("SERVER LISTENING")},
    serverClosing = function () {
      console.log(">>> CLOSING ");
      server.close(serverClosed)
    },
    serverClosed = function () {console.log("CLOSED!!")},
    processExit = function () {
      console.log(">>> TEST TIMED OUT!!! ");
      process.exit(1);
    },
    server = net.createServer(serverCreated);

server.listen(4000,serverListening);

setTimeout(serverClosing, 2000);

setTimeout(processExit, 2000);

所以执行的顺序是:

  1. 创建所有变量
  2. server.listen(4000,serverListening);
  3. 节点将serverListening添加到回调队列
  4. setTimeout(serverClosing,2000);
  5. 节点将serverClosing添加到回调队列
  6. setTimeout(processExit,2000);
  7. 节点将processExit添加到回调队列
  8. 2秒:节点调用serverClosing
  9. 2秒:节点调用processExit
  10. 流程存在且执行停止。
  11. 如果在步骤6中添加4ms,则6之后的顺序变为:

    1. 节点将processExit添加到回调队列
    2. 2秒:节点调用serverClosing
    3. ServerClosed
    4. 2.004秒:节点调用processExit
    5. 流程存在且执行停止。
    6. 在我的机器上我必须添加4毫秒,但在其他机器上它可能或多或少。这取决于ServerClosing需要多长时间。

      注意:您不必调用proces.exit。当没有更多回调或代码要执行时,节点将退出。只需从我的示例中删除最后一行来测试它。