【发布时间】:2020-04-26 12:19:30
【问题描述】:
我有两个不相关的节点 js 进程在同一台 Windows 机器上运行。我希望这两个进程相互通信,但不使用 FileIO(性能问题)和 Sockets(安全问题)。我们有什么办法可以做到吗?我已阅读有关共享内存和基于管道的通信的信息,但找不到节点 js 的任何实现。
【问题讨论】:
标签: node.js ipc shared-memory
我有两个不相关的节点 js 进程在同一台 Windows 机器上运行。我希望这两个进程相互通信,但不使用 FileIO(性能问题)和 Sockets(安全问题)。我们有什么办法可以做到吗?我已阅读有关共享内存和基于管道的通信的信息,但找不到节点 js 的任何实现。
【问题讨论】:
标签: node.js ipc shared-memory
这个问题的答案取决于一个节点进程是否正在启动另一个。如果一个节点进程使用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 的流量也会绕过网络工作,因此它永远不会离开您的计算机或进入您的网卡。
您还可以使用更难访问的本地命名套接字。
如果您担心其他本地服务能够与您的频道通信,您可以通过传递秘密信息或加密内容来解决这个问题。
您可以在以下 Stack Overflow 答案中找到有关使用命名套接字和管道的更多详细信息:How to create a named pipe in node.js?
【讨论】: