首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Node-IPC将消息从服务器发送到客户端

Node-IPC将消息从服务器发送到客户端
EN

Stack Overflow用户
提问于 2016-10-03 15:50:37
回答 3查看 4.2K关注 0票数 3

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

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2018-05-02 23:41:36

在回顾了文档并深入研究了源代码之后,我想我可以得出结论,没有一种方法可以准确地实现您正在寻找的目标。尽管您可以看到服务器在here内部维护信息并在socket.disconnected事件上公开信息,但套接字的ids并未公开。

据我所知,有两种解决方案,都需要你的跑腿工作:

  1. 使用ipc.server.broadcast向所有客户端发送消息。除了要传输的有效负载之外,还需要包含某种标识符。然后,客户端将对为其标识的消息执行某些操作,否则将忽略有效负载。
  2. 将使用ipc.of.world.emit()从服务器请求消息的负担放在了客户端身上。这可能是服务器立即响应的“有效同步”操作,但此模型也适用于异步情况,客户端识别其请求,服务器在得到客户端请求的结果时进行响应。

当然,“稍微激进一点”的解决方案总是派生node-ipc,并使其适用于您的用例:)

票数 2
EN

Stack Overflow用户

发布于 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'
  }
);

票数 1
EN

Stack Overflow用户

发布于 2020-04-11 08:54:54

我找到了一些合并的PR来解决这个问题,但是我在node-ipc的9.x中找不到代码了

基本上我自己做了握手:

ipc.connectTo()上,通过‘ipc.config.id’事件发送您的套接字:ipc.emit('_handshake', {client_id: ip.config.id})

  • on服务器,侦听'_handshake‘并存储通过{client_id: sock}映射

  • 获得的sock,现在您可以从服务器将其发送到特定的套接字,因为您已将其保存。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39826776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档