我有两个不相关的节点js进程在同一Windows机器上运行。我希望这两个进程可以相互通信,但不使用FileIO(性能问题)和Sockets(安全问题)。有什么办法可以做到吗?我已经阅读了有关共享内存和基于管道的通信,但是找不到节点js的任何实现。
答案取决于一个节点进程是否正在启动另一个节点进程。如果一个节点进程正在使用fork()
启动另一个节点进程,则它可以使用process.send()
和process.on('message', ...)
进行通信。
// parent.js
const cp = require('child_process');
const n = cp.fork(`${__dirname}/sub.js`);
n.on('message', (m) => {
console.log('PARENT got message:', m);
});
// Causes the child to print: CHILD got message: { hello: 'world' }
n.send({ hello: 'world' });
对于子进程:
// child.js
process.on('message', (m) => {
console.log('CHILD got message:', m);
});
// Causes the parent to print: PARENT got message: { foo: 'bar', baz: null }
process.send({ foo: 'bar', baz: NaN });
如果在另一个句柄上,则分别启动流程,这是另一回事。这导致了一个问题,当您说不想使用套接字来解决安全问题时,这意味着什么?
您是否担心可以从计算机外部访问节点进程。因为只有绑定到IP地址0.0.0.0或您的公共IP地址之一,这种情况才会发生。如果绑定到127.0.0.1,则应该不会发生这种情况,那么只能从计算机上访问它。
前往127.0.0.1的流量也会绕过网络工作,因此它永远不会离开您的计算机或进入您的网卡。
此外,您还可以使用本地命名套接字,这些套接字甚至更难访问。如果您担心某些其他本地服务将能够与您的频道进行通信,则可以通过传递秘密信息或加密内容来解决此问题。
您可以在以下堆栈溢出答案中找到有关使用命名套接字和管道的更多详细信息:How to create a named pipe in node.js?