使用Node.js,我们可以创建一个服务器并侦听随机端口:
var server = net.createServer();
server.listen(0, '127.0.0.1');
第一个参数,端口0
,表示选择一个随机端口,127.0.0.1
表示仅监听本地主机,正如文档中所述。
Node.js会选择一个未被使用的端口吗?我需要自己检查并重试吗,如果Node.js恰好选取了已经打开并绑定到另一个应用程序的端口?它会选择任何旧端口,还是只有用户区端口(>1024)?
使用Node.js,我们可以创建一个服务器并侦听随机端口:
var server = net.createServer();
server.listen(0, '127.0.0.1');
第一个参数,端口0
,表示选择一个随机端口,127.0.0.1
表示仅监听本地主机,正如文档中所述。
Node.js会选择一个未被使用的端口吗?我需要自己检查并重试吗,如果Node.js恰好选取了已经打开并绑定到另一个应用程序的端口?它会选择任何旧端口,还是只有用户区端口(>1024)?
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);
createServer(address.port + 1)
而不是 createServer(0)
。 - TrottNode.js会选择一个未被使用的端口吗?
是的,端口将是可用的端口。操作系统会选择一个未被使用的端口,而不是Node.js,但从最终用户的角度来看,这差不多是一样的。
毫无疑问,文档在此问题最初发布于2012年时可能有不同的措辞,但截至目前(2019年1月),它明确说明了这一点:“如果省略端口或端口为0,则操作系统将分配任意未使用的端口...”。
我需要自己检查并重试吗,如果Node.js恰好选择了已经打开并绑定到另一个应用程序的端口?
不需要,你不需要编写额外的代码来测试端口的可用性。
它选择任何旧端口,还是只选择用户区域端口(>1024)?
据我所知,它总是选择未特权端口。
对于像 macOS 这样按顺序分配可用端口的操作系统,以下代码显示如果端口不可用,则操作系统将跳过该端口。
// Testing for macOS, which supplies available ports sequentially.
var net = require('net');
createServer(0, function () {
var port = this.address().port;
console.log('server was assigned port ' + port);
createServer(port+1, function () {
var port = this.address().port;
console.log('server was assigned port ' + port);
createServer(0, function () {
var port = this.address().port;
// This line will show that the OS skipped the occupied port and assigned the next available port.
console.log('server was assigned port ' + port);
});
});
});
function createServer(port, callback) {
console.log('create server with port ' + port);
var server = net.createServer();
server.listen(port, callback).unref();
}