【问题标题】:Node.JS Socket.IO sending packets to specific connection IDsNode.JS Socket.IO 向特定连接 ID 发送数据包
【发布时间】:2012-04-18 15:54:27
【问题描述】:

过去一周我一直在寻找这个特殊的问题,但由于我找不到任何关于这个主题的信息(那不是过时的),所以我决定做其他事情。但是现在我需要能够使用他们的 ID 将数据(我构建的)发送到特定的客户端,这些客户端使用 node.js 和 socket.io 连接到我的服务器。我已经将 ID 存储在每个新连接的对象中。我需要知道的是一种将其发送到我选择的连接 ID 的方法。

类似:function send(data, client.id) {};

我使用的是 http 服务器,而不是 TCP。

这可能吗?

编辑:

server = http_socket.createServer(function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    res.end(respcont);
    client_ip_address = req.header('x-forwarded-for');
    });
socket = io.listen(1337);   // listen
//=============================================
//  Socket event loop
//=============================================
socket.on ('connection', function (client_connect) {
    var client_info = new client_connection_info();     // this just holds information 
    client_info.addNode(client_connect.id, client_connect.remoteAddress, 1); // 1 = trying to connet

    var a = client_info.getNode(client_connect.id,null,null).socket_id; // an object holding the information.  this function just gets the socket_id
    client_connect.socket(a).emit('message', 'hi');

    client_connect.on('message', function (data) {
         });
    client_connect.on ('disconnect', function () {

    );
});

解决方案:我只是通过实验找到了答案...您要做的是确保存储 SOCKET,而不是 socket.id(就像我正在做的那样)并使用它。

client_info.addNode(client_connect.id, client_connect.remoteAddress, client_connect, 1)

var a = client_info.getNode(client_connect.id,null,null,null).socket;
    a.emit('message', 'hi');

【问题讨论】:

  • 仅供参考,HTTP 是一种通过 TCP 连接工作的协议。 TCP 是一种使用 IP 的协议,而 IP 又使用(主要)以太网,后者使用电或光信号。
  • 啊,谢谢。我只是不想获得 TCP 版本而不是 http 版本的帮助(如果这有所不同的话)。其实我也是不久前才知道的! :)

标签: javascript node.js socket.io


【解决方案1】:

如果您需要这样做,最简单的做法是构建和维护一个将 id 映射到连接的全局关联数组:然后您可以在需要时查找适当的连接,只需使用常规发送函数。您需要一些逻辑来从数组中删除连接,但这应该不会太痛苦。

【讨论】:

  • 我知道必须有一些方法来完成我想做的事情,因为在 node.js 和 socket.io 的更高版本中是可能的。编辑:我已经存储了连接 ID,我还需要存储什么?
  • 我接受了你的回答,因为它是正确的。我只是不明白你想表达什么。
  • @Femi 如果您不考虑可扩展性,这是一个很好的解决方案。让它在多台机器上工作真的很困难。
【解决方案2】:

是的,这是可能的。

io.sockets.socket(id).emit('message', 'data');

【讨论】:

  • 嗯,我似乎无法正常工作。我会用我如何称呼事物来更新我的代码。
【解决方案3】:

您的解决方案有一个主要缺点:缩放。当您的应用程序需要更多的一台机器时,您会怎么做?使用内部 ID 也可能很困难。我建议使用外部 ID(如用户名)。

类似于this post 我建议使用房间(与 Redis 一起允许扩展)。为每个新套接字添加私人房间(例如基于用户名)。代码可能如下所示:

socket.join('priv/' + name);
io.sockets.in('priv/' + name).emit('message', { msg: 'hello world!' });

此解决方案允许多台机器向任何用户发出事件。在我看来,它也非常简单和优雅。

【讨论】:

  • 我不能将这样的解决方案用于服务器游戏引擎。我必须使用他们的套接字和数据库信息为每个玩家创建对象。
  • 当然可以。要存储与给定套接字关联的数据,您可以使用 socket.setsocket.get 以及 JSON 编码。您应该颠倒这个概念:将信息保存在套接字中(好),而不是将套接字保存在信息中(坏)。
猜你喜欢
  • 1970-01-01
  • 2013-01-19
  • 2014-07-28
  • 2014-07-25
  • 2012-05-24
  • 2018-08-03
  • 1970-01-01
  • 2013-01-03
相关资源
最近更新 更多