Siguiendo la documentación oficial del nodo de los módulos net y child_process , archive esto: un servidor que genera un niño y se conecta a través del módulo net . Pero la conexión es intermitente. El código se explica por sí mismo, pero agregué detalles en los comentarios del código:
// 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 }) } }); el registro esperado cuando se ejecuta node server es:
server is listening server listen callback forked child is ready got socket connection someone connected to server child first message pero como la devolución de llamada del socket (en createServer ) es intermitente, obtenemos esto el 50% de las veces:
server is listening server listen callback forked child is readyNo sé qué hacer más, ya intenté todo lo que pude... ¿Qué estoy haciendo mal?
Acabo de encontrar cuál era el problema... cuando leí la documentación, entendí mal que, literalmente, el servidor net se envía al proceso secundario para compartir las "conexiones" para dividir el procesamiento en más de un proceso, y lo que estaba tratando de El archivo era solo una comunicación bidireccional con el niño bifurcado. Dejaré esta respuesta aquí si alguien llega al mismo problema que yo. Este es el código final:
// 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'); }) } });