Node.js模块,用于在两个客户端之间进行通信?

时间:2015-10-16 16:28:46

标签: javascript node.js websocket

我正在寻找Node.js模块(或建议/想法),以便我的服务器可以创建/处理特定客户端之间的双向通信

换句话说,我希望能够将来自客户端X的数据传输到客户端Y,反之亦然。

我正在调查socket.io但它似乎是一个传统的Web套接字服务器,它接收来自所有客户端的消息,然后将相同的消息发送给所有客户端。我可能错了,因为我没有这方面的经验。

就我而言,我确实希望我的服务器能够接收来自不同客户端的消息,但我希望服务器将这些消息转发给特定客户端。

e.g。

  • 仅从客户端X转发到客户端Y的消息(反之亦然)
  • 仅从客户端A转发到客户端B的消息(反之亦然)

我对网络套接字没有经验(我甚至不确定网络套接字是否是我正在寻找的)但我确实有基本Node.js服务器的经验。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

我也是NodeJs的新手。简要回答你的问题

Socket.io 是前进的方向。您可以通过在不同端口上连接来隔离客户端通信。

客户端X仅限客户端Y - 端口1234

仅客户端A到客户端B - 端口1256

此致

答案 1 :(得分:1)

Socket.io 将帮助您在多个客户端和服务器之间设置websockets,以便您可以在连接的实例之间实时同步数据。这是客户端 - 服务器通信

我认为您想要的是 WebRTC 库,例如PeerJS。这个特别设置了一个握手服务器,使用Node.js桥接两个客户端之间的连接,并让他们自己从那一点进行通信,只要websocket持续(即:a)刷新会打破连接)。该库可以帮助您实现客户端 - 客户端实时通信。

This Stack Overflow thread可以帮助您进一步了解更长的WebRTC库列表。

答案 2 :(得分:1)

在Node.js WebSocket服务器中,由于您对服务器进行了编码,因此您可以完全控制谁获取了哪些消息。你可以这样做......

当客户端与服务器建立WebSocket连接并将其连接对象存储在数组中时,您可以将其连接的索引视为其ID。如果需要,您可以在此时向所有其他客户端广播此ID(及其IP地址),以便让他们知道谁已连接。然后,当客户端想要向另一个或多个客户端发送消息时,让进行消息传递的客户端包括目标客户端以及消息。这是服务器的相关部分:

var client_list = [];

ws_server.on('request', function(request) {
  var connection = request.accept(null, request.origin);

  //let all other clients know that a new client has arrived
  //send the new client's ID and IP address
  for(var i = 0; i < client_list.length; i++) {
    client_list[i].send(JSON.stringify({
      type: "new client",
      data: {
        ID: client_list.length,
        IP: connection.remoteAddress
      }
    }));
  }

  //store the new connection
  client_list.push(connection);

  //let the new client know what their ID is
  connection.send(JSON.stringify({
    type: "assignment",
    data: {
      ID: client_list.length - 1
    }
  }));

  //when you receive a message from a client of type "relay",
  //send it to the intended targets
  connection.on("message", function(message) {
    var parsed_message = JSON.parse(message.utf8Data);
    if(parsed_message.type === "relay") {
      for(var i = 0; i < parsed_message.targets.length; i++) {
        client_list[parsed_message.targets[i]].send(parsed_message.data);
      }
    }
  });
});

来自客户端的外发邮件如下所示:

{
  type: "relay",
  targets: [1, 33, 7],
  data: {
    content: "Hey guy!",
    origin: my_id
  }
}

我没有测试过,所以如果它给你带来麻烦,请告诉我。