当使用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总是一个空对象,我仍然不知道套接字客户端ID ..
所以我能想到的唯一方法是将每个进程作为服务器和客户端启动......或者在客户端连接后,我发送一个' _identification'具有硬编码ID的事件并将套接字存储在单独的对象中,但这没有任何意义,因为套接字已经在ipc.serve的on(' connect')函数中给出()...
那么,node-ipc服务器如何向连接的客户端发送消息?
谢谢!
答案 0 :(得分:1)
审阅了文档并深入挖掘了源代码后,我想我可以得出结论,没有办法完成完全您正在寻找的内容。虽然您可以看到服务器在内部维护信息here并在socket.disconnected事件上公开它,但套接字的ID根本不会暴露出来。
我可以看到两种解决方案,两者都需要你的腿部工作:
使用ipc.server.broadcast向所有客户端发送消息。除了要传输的有效负载外,还需要包含某种标识符。然后,客户端会对为其识别的消息执行某些操作,否则将忽略有效负载。
将负担放在客户端上,使用ipc.of.world.emit()从服务器请求消息。这可能是一个"有效同步"服务器立即响应的操作,但此模型也在异步情况下工作,客户端识别他们的请求,服务器响应客户端请求的结果。
当然"稍微更激烈"解决方案始终是fork node-ipc并使其适用于您的用例:)
答案 1 :(得分:1)
从服务器端,您可以执行类似的操作,假设您只有一个套接字。您也可以修改它以管理多个套接字。
// 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'
}
);
答案 2 :(得分:0)
我发现已合并了一些PR来解决此问题,但在node-ipc
的9.x版本中找不到代码了
我基本上是自己握手的:
ipc.connectTo()
上,通过“ _handshake”事件发送您的ipc.config.id:ipc.emit('_handshake', {client_id: ip.config.id})
{client_id: sock}
映射获得的袜子