node.js - Node.js 如何选择随机端口?

标签 node.js port

使用 Node.js,我们可以创建一个服务器并监听一个随机端口:

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

第一个参数port 0表示选择随机端口,127.0.0.1表示只监听localhost,as documented .

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

最佳答案

操作系统分配端口号。见 https://github.com/joyent/node/blob/v0.6.11/lib/net.js#L780-783

在 OS X 上,分配是顺序的、用户态的,并且不检查端口以确认它没有被使用。

在 Ubuntu 11.04 上,分配是随机的、用户态的,也不会检查端口是否正在使用中。

以下脚本可用于在其他平台上进行测试。为了验证端口是用户空间,我通过 bash 将脚本运行了 10,000 次,通过管道连接到 grep -c "p​​ort: [0-9]{1,3}",匹配为零。<​​/p>

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);

关于node.js - Node.js 如何选择随机端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9901043/

相关文章:

angularjs - 使用 Electron 创建 Exe 文件,无需资源文件夹

linux - 在 nodejs 的部署服务器上初始化 git

javascript - 如何确定已安装的 webpack 版本

linux - 应用路径和监听端口

javascript - 使用 Async/Await 编写基于 Promise 的 HTTP 请求

javascript - Fire Base 云功能在 Node.js 文件中不起作用

MySql 连接到另一个端口时出现问题

docker - 使用Nginx无法启动Docker容器

java - netty4 :How to listen on multiple ports on a java process

java - Java中如何从本地端口读入数据?