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

Node.js net模块实现IPC服务端出现连接间歇性触发异常问题求助

问题核心原因

  1. 错误传递net.Server句柄给子进程:Node.js的IPC机制支持传递TCP服务端句柄实现多进程共享端口,内核会自动将进来的连接轮询分配给所有持有该句柄的进程。你的子进程拿到服务端句柄后没有绑定connection事件处理逻辑,所以50%被分配到子进程的连接不会触发任何主进程日志,这就是间歇性触发的直接原因。
  2. 子进程监听了错误的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 20:27:02