当使用node-ipc通过IPC在NodeJS进程之间通信时,启动服务器并侦听连接,或者创建客户端并连接到服务器似乎非常简单。
但有一件事看起来并不那么简单:
服务器如何将消息推送到客户端?
手册上说,
客户端上的,在服务器上侦听消息:
ipc.connectTo('world', function(){
ipc.of.world.on('hello', function(data){
console.log(data);
}
)
}
);
很简单……但是:
服务器上的,发送消息
// Start server
ipc.serve(function(){
// Listen for connecting clients
ipc.server.on('connect', socket => {
// From here I can do ipc.server.emit(socket, 'message', {});
// But I still do not know the ID of the client that just connected
// There could be 10 child processes connecting, I do not know which client this is
});
});
因此,假设我按照上面给定的示例设置了服务器,并连接了客户端。之后在不同的timeFrame中,在服务器端,您会期望这是向客户端发送消息的方式:
ipc.server.of[TheClientIdThatJustConnected].emit('myMessage')
但是这不起作用,因为ipc.server.of始终是一个空对象,而我仍然不知道套接字客户端I。
因此,我能想到的唯一方法就是同时作为服务器和客户端启动每个进程……或者在客户端连接之后,我发送一个带有硬编码ID的'_identification‘事件,并将该套接字存储在一个单独的对象中,但这没有任何意义,因为套接字已经在ipc.serve()的on('connect')函数中给出了……
那么,node-ipc服务器如何向连接的客户机发送消息呢?
谢谢!
发布于 2018-05-02 23:41:36
在回顾了文档并深入研究了源代码之后,我想我可以得出结论,没有一种方法可以准确地实现您正在寻找的目标。尽管您可以看到服务器在here内部维护信息并在socket.disconnected事件上公开信息,但套接字的ids并未公开。
据我所知,有两种解决方案,都需要你的跑腿工作:
当然,“稍微激进一点”的解决方案总是派生node-ipc,并使其适用于您的用例:)
发布于 2018-09-07 07:48:10
在服务器端,假设您只有一个套接字,您可以这样做。不过,您也可以调整它来管理多个套接字。
// Define your server
let mySocket;
ipc.serve(
() => {
ipc.server.on(
'app.message',
(data, socket) => {
mySocket = socket;
ipc.server.emit(
socket,
'app.message',
{
id: ipc.config.id,
message: data.message
}
);
}
);
}
);
ipc.server.start();
// Emit a message to that socket later
ipc.server.emit(
mySocket,
'app.message',
{
id: ipc.config.id,
message: 'Server emitted message'
}
);
发布于 2020-04-11 08:54:54
我找到了一些合并的PR来解决这个问题,但是我在node-ipc
的9.x中找不到代码了
基本上我自己做了握手:
在ipc.connectTo()
上,通过‘ipc.config.id’事件发送您的套接字:ipc.emit('_handshake', {client_id: ip.config.id})
{client_id: sock}
映射
https://stackoverflow.com/questions/39826776
复制相似问题