2012-03-28 100 views
10

隨着Node.js的,我們可以創建一個服務器,聽隨機端口:Node.js如何選擇隨機端口?

var server = net.createServer(); 
server.listen(0, '127.0.0.1'); 

第一個參數,端口0,表示選擇一個隨機端口,並127.0.0.1表示聽本地主機上的唯一,as documented

Node.js是否選擇了一個未被使用的端口?如果Node.js碰巧選擇一個已經打開並綁定到另一個應用程序的端口,我是否必須檢查自己並重試?它是否會選擇任何舊端口,或只有用戶端口(> 1024)?

+0

我認爲它只是分配一個隨機端口,但我不是100%。我想你需要做的錯誤和增量等...就像在鏈接(他們重試與相同的端口雖然) – bryanmac 2012-03-28 05:18:51

+0

但是,你必須想知道什麼意思啓動一些隨機可用的端口 - 除非你有某種類型的服務發現,其他人和客戶很難發現你隨機發現的東西:) – bryanmac 2012-03-28 05:20:39

+0

這通常不是一個問題,因爲您同意某個端口或使用知名端口。如果您沒有綁定所述端口的權限,那麼您還有其他問題需要解決。 – 2012-03-28 08:41:23

回答

26

操作系統分配端口號。請參閱https://github.com/joyent/node/blob/v0.6.11/lib/net.js#L780-783

在OS X上,分配是順序的,userland,並且不檢查端口以驗證端口未被使用。

在Ubuntu 11.04上,這個任務是隨機的,userland,也不檢查端口是否在使用中。

下面的腳本可以用於在其他平臺上測試。要驗證端口是userland,我通過bash管理腳本10,000次,以零匹配傳輸到grep -c「port:[0-9] {1,3}」。

var net = require('net'), 
    firstPort; 

(function createServer(port) { 
    var server = net.createServer(); 
    server.listen(port, function() { 
    address = server.address(); 
    if (port === 0) { 
     if (firstPort === undefined) { 
     firstPort = address.port; 
     // cause a EADDRINUSE in 10 more sockets for sequential platforms 
     // without this, will run out of fd's before hitting EADDRINUSE 
     createServer(firstPort + 10); 
     console.log('addr in use port trap: ', firstPort + 10); 
     } else { 
     // on OS X (sequential) this will increment the OS's sequential counter 
     // and not cause EADDRINUSE 
     createServer(address.port + 1); 
     } 
     createServer(0); 
    } 
    console.log("requested port:", port, " binded port:",address.port); 
    }); 
})(0);