端口被占用时如何自动递增查找可用端口(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
相关产品推荐
相关产品推荐

