Node-IPC从服务器向客户端

时间:2016-10-03 07:50:37

标签: ipc child-process

当使用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服务器如何向连接的客户端发送消息?

谢谢!

3 个答案:

答案 0 :(得分:1)

审阅了文档并深入挖掘了源代码后,我想我可以得出结论,没有办法完成完全您正在寻找的内容。虽然您可以看到服务器在内部维护信息here并在socket.disconnected事件上公开它,但套接字的ID根本不会暴露出来。

我可以看到两种解决方案,两者都需要你的腿部工作:

  1. 使用ipc.server.broadcast向所有客户端发送消息。除了要传输的有效负载外,还需要包含某种标识符。然后,客户端会对为其识别的消息执行某些操作,否则将忽略有效负载。

  2. 将负担放在客户端上,使用ipc.of.world.emit()从服务器请求消息。这可能是一个"有效同步"服务器立即响应的操作,但此模型也在异步情况下工作,客户端识别他们的请求,服务器响应客户端请求的结果。

  3. 当然"稍微更激烈"解决方案始终是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})
  • 在服务器上,侦听“ _handshake”并存储通过{client_id: sock}映射获得的袜子
  • 现在,由于已保存,因此可以从服务器发送到该特定的套接字。