javascript - 节点 `net` 模块 IPC 服务器间歇性
问题描述
按照net
和child_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
但由于套接字回调 (at createServer
) 是间歇性的,我们得到 50% 的时间:
server is listening
server listen callback
forked
child is ready
IDK该做什么了,已经尝试了我能做的一切......我做错了什么?
解决方案
刚刚发现问题出在哪里......当我阅读文档时,我误解了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');
})
}
});
推荐阅读
- android - java.lang.NoSuchMethodError:没有静态方法
- java - 这里k - 1 和--k 的区别,真的不明白
- php - 从 PHP 中的“提交”按钮插入 mysql 值不起作用
- android - Cordova 8 中未生成签名的 APK
- c# - 单击子按钮时删除父用户控件
- c - 不要正确加密wincrypt
- java - 应用程序在 android studio 的 managedQuery 行中崩溃
- java - 如何从java中的字符串动态获取别名和列
- java - Spring Boot 库中的可选依赖类
- matlab - 这个矩阵乘法在 MATLAB 中有意义吗?