Node.js如何select随机端口?

使用Node.js,我们可以创build一个服务器并在随机端口上侦听:

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

第一个参数,端口0表示select一个随机端口, 127.0.0.1表示仅在本地主机上侦听, 如logging 。

Node.js是否select了一个未被使用的端口? 如果Node.js碰巧select已经打开并绑定到另一个应用程序的端口,我是否必须检查自己并重试? 它是否会select任何旧的端口,或只有用户端口(> 1024)?

OS分配端口号。 请参阅https://github.com/joyent/node/blob/v0.6.11/lib/net.js#L780-783

在OS X上,分配是连续的,userland,并且不检查端口以validation它未被使用。

在Ubuntu 11.04上,这个任务是随机的,并且也不会检查端口是否在使用中。

下面的脚本可以用来testing其他平台。 要validation端口是userland,我运行脚本10000次通过bashpipe道grep-c“端口:[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);