2012-12-16 123 views
0
的NodeJS

我想打电话给close()一个nodeJS TCP服务器上,但它似乎并没有发生。这里是我的代码TCP服务器不关闭,

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

任何想法为什么?被调用,但不知何故输出任何东西?

回答

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,serverListening);
  3. 节点添加serverListening回调队列
  4. setTimeout(serverClosing,2000);
  5. 节点将serverClosing添加到回调队列
  6. setTimeout(processExit,2000);
  7. 节点将processExit回调队列
  8. 2秒:节点呼叫serverClosing
  9. 2秒:节点调用processExit
  10. 进程存在和执行停止。

如果添加的4ms到步骤6,则6之后的顺序变为:

  1. 节点将processExit回调队列
  2. 2秒:节点呼叫serverClosing
  3. ServerClosed
  4. 2.004秒:节点呼叫processExit
  5. 进程存在和执行停止。

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

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

+0

感谢,这真的帮助 – Yotam