You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

端口被占用时如何自动递增查找可用端口(Vite/Express/ws场景)

实现WebSocket服务器自动寻找可用端口

要实现类似Vite的自动递增端口找可用端口的功能,你可以借助Node.js的net模块检测端口是否被占用,从指定的起始端口(比如311)开始逐个尝试,直到找到可用端口再启动WebSocket服务器。

具体实现代码

const { WebSocketServer } = require('ws');
const net = require('net');

// 定义起始端口
const startPort = 311;

// 检测端口是否可用的函数
function isPortAvailable(port) {
  return new Promise((resolve) => {
    const server = net.createServer();
    server.unref(); // 不阻止进程退出
    server.on('error', () => resolve(false));
    server.listen(port, () => {
      server.close(() => resolve(true));
    });
  });
}

// 寻找可用端口的函数
async function findAvailablePort(startPort) {
  let currentPort = startPort;
  while (true) {
    const available = await isPortAvailable(currentPort);
    if (available) {
      return currentPort;
    }
    currentPort++;
    console.log(`端口${currentPort - 1}已被占用,尝试端口${currentPort}`);
  }
}

// 启动WebSocket服务器
async function startWsServer() {
  const availablePort = await findAvailablePort(startPort);
  const sockserver1 = new WebSocketServer({ port: availablePort });
  
  console.log(`WebSocket服务器已启动,监听端口:${availablePort}`);

  sockserver1.on('connection', ws => {
    sockserver1.clients.forEach(client => {
      client.send(`A new player connection has been established`);
    });

    ws.on('message', data => {
      sockserver1.clients.forEach(client => {
        client.send(`${data}`);
      });
    });

    ws.on('close', () => {
      sockserver1.clients.forEach(client => {
        client.send(`A player has disconnected`);
      });
    });

    ws.onerror = function () {
      console.log('websocket error');
    };
  });
}

// 执行启动
startWsServer();

代码说明

  • isPortAvailable函数通过创建临时的net服务器尝试监听指定端口,能监听成功则端口可用,失败则不可用。
  • findAvailablePort从起始端口开始循环检测,返回第一个可用的端口。
  • startWsServer先获取可用端口,再初始化WebSocketServer,确保服务器能正常启动。

这样你多次运行程序时,就会自动从311开始寻找第一个未被占用的端口,避免端口冲突报错。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 09:33:17