节点`net`模块IPC服务器间歇性。

4

根据官方node文档中netchild_process模块的指导,我实现了以下功能:一个通过net模块与子进程连接的服务器。但是连接不稳定。代码本身易于理解,但我在代码注释中添加了细节说明:

// server.js
const childProcess = require('child_process').fork('child.js');
const server = require('net').createServer((socket) => {
    console.log('got socket connection'); // this callback is intermitent
    socket.on('data', (stream) => {
        console.log(stream.toString());
    })
});

server.on('connection', () => {
    console.log('someone connected to server'); // this is running only if the code above runs (but its intermitent)
});

server.on('listening', () => {
    console.log('server is listening'); // this is the first log to execute
    childProcess.send('server', server); // send the server connection to forked child
});

server.listen(null, function () {
    console.log('server listen callback'); // this is the second log to execute
});

// child.js
console.log('forked'); // this is the third log to execute
const net = require('net');

process.on('message', (m, server) => {
    if (m === 'server') {
        const socket = net.connect(server.address());
        socket.on('ready', () => {
            console.log('child is ready'); // this is the fourth log to execute
            socket.write('child first message'); // this is always running
        })
    }
});

执行node server时,预期的日志如下:
server is listening
server listen callback
forked
child is ready
got socket connection
someone connected to server
child first message

但是由于套接字回调函数(在createServer中)是间歇性的,我们有时会得到50%的以下结果:

server is listening
server listen callback
forked
child is ready

我不知道该怎么办了,已经尝试了我所能做的一切......我错在哪里了?

1个回答

1

刚刚找到问题所在...当我阅读文档时,我误解了字面上的意思,net服务器实际上是被发送到子进程以共享“连接”,以将处理分成多个进程,而我试图实现的只是与派生的子进程进行双向通信。如果有人遇到和我一样的问题,我会把这个答案留在这里。这是最终代码:

// 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.listen(null, function () {
    childProcess.send(server.address());
});

// child.js
console.log('forked');
const net = require('net');

process.on('message', (message) => {
    if (message.port) {
        const socket = net.connect(message);
        socket.on('ready', () => {
            console.log('child is ready');
            socket.write('child first message');
        })
    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接