0

我正在尝试调用close()TCPnodeJS服务器,但似乎没有发生。这是我的代码

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!!! 

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

4

1 回答 1

2

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

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

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

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,serverListen);
  3. 节点将 serverListening 添加到回调队列
  4. 设置超时(服务器关闭,2000);
  5. 节点将 serverClosing 添加到回调队列
  6. 设置超时(进程退出,2000);
  7. 节点将 processExit 添加到回调队列
  8. 2 秒:节点调用 serverClosing
  9. 2 秒:节点调用 processExit
  10. 进程存在,执行停止。

如果在第 6 步加上 4ms,那么 6 之后的顺序变为:

  1. 节点将 processExit 添加到回调队列
  2. 2 秒:节点调用 serverClosing
  3. 服务器关闭
  4. 2.004 秒:节点调用 processExit
  5. 进程存在,执行停止。

在我的机器上我必须添加 4ms,但在其他机器上它可能或多或少。这取决于 ServerClosing 需要多长时间。

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

于 2012-12-16T11:07:07.803 回答