2012-12-16 143 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