2012-03-28 104 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);