Node.js net模块实现IPC服务端出现连接间歇性触发异常问题求助
问题核心原因
- 错误传递
net.Server句柄给子进程:Node.js的IPC机制支持传递TCP服务端句柄实现多进程共享端口,内核会自动将进来的连接轮询分配给所有持有该句柄的进程。你的子进程拿到服务端句柄后没有绑定connection事件处理逻辑,所以50%被分配到子进程的连接不会触发任何主进程日志,这就是间歇性触发的直接原因。 - 子进程监听了错误的socket事件:
net.connect()返回的socket实例,连接成功的标准触发事件是connect而非ready,ready事件的触发时序不稳定,可能在连接未完全建立时就提前执行写入逻辑。
修复方案
你不需要传递完整的服务端句柄给子进程,只需要传递服务端的监听地址即可:
修复后的server.js
const childProcess = require('child_process').fork('child.js'); const server = require('net').createServer((socket) => { console.log('got socket connection'); socket.on('data', (stream) => { console.log(stream.toString()); }) }); server.on('connection', () => { console.log('someone connected to server'); }); server.on('listening', () => { console.log('server is listening'); // 只传递监听地址,不传递服务端句柄 childProcess.send('server', server.address()); }); server.listen(null, function () { console.log('server listen callback'); });
修复后的child.js
console.log('forked'); const net = require('net'); process.on('message', (m, address) => { if (m === 'server') { const socket = net.connect(address); // 监听正确的连接成功事件 socket.on('connect', () => { console.log('child is ready'); socket.write('child first message'); }) } });
修复后效果
运行后100%输出你预期的日志顺序,不会再出现连接回调丢失的问题。
内容的提问来源于stack exchange,提问作者Dreanmer
相关产品推荐
相关产品推荐

