Javascript Node.JS Socket.IO向特定连接ID发送数据包

Javascript Node.JS Socket.IO向特定连接ID发送数据包,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,在过去的一周里,我一直在寻找这个特殊的问题,因为我找不到关于这个主题的任何信息(这不是过时的),所以我决定做其他的事情。但现在我需要能够使用特定的客户机ID将数据(我构建的)发送到特定的客户机,这些客户机使用node.js和socket.io连接到我的服务器。我已经将每个新连接的ID存储在对象中。我需要知道的是一种将其发送到我选择的连接ID的方法 类似于:函数send(data,client.id){} 我使用的是http服务器,而不是TCP 这可能吗 编辑: 解决方案:我只是通过实验发现了。。

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

类似于:函数send(data,client.id){}

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

这可能吗

编辑:

解决方案:我只是通过实验发现了。。。您要做的是确保存储的是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');

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

是的,这是可能的

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

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

与我的建议类似,我建议使用房间(与Redis一起允许缩放)。为每个新插座添加私人空间(例如,基于用户名)。代码可能如下所示:

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

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

仅供参考,HTTP是一种在TCP连接上工作的协议。TCP是一种使用IP的协议,而IP又使用(大部分)以太网,以太网使用电信号或光信号。啊,谢谢。我只是不想得到TCP版本而不是http版本的帮助(如果这有区别的话)。事实上,我不久前才知道这一点!:)我知道必须有某种方法来完成我想做的事情,因为在node.js和socket.io的更高版本中这是可能的。编辑:我已经存储了连接ID,还需要存储什么?我接受了你的答案,因为它是正确的。我只是不明白你们想表达什么意思。@Femi如果你们不考虑可伸缩性,这是一个很好的解决方案。要让它在多台机器上工作真的很难。嗯,我似乎无法让它工作。我会更新我的代码,告诉你我是怎么调用的。我不能把这样的解决方案用于服务器游戏引擎。我必须用每个玩家的套接字和数据库信息为他们创建对象。当然你可以。要存储与给定套接字关联的数据,可以使用
socket.set
socket.get
以及JSON编码。您应该颠倒这个概念:将信息保存在套接字内部(好),而不是套接字内部信息(坏)。
socket.join('priv/' + name);
io.sockets.in('priv/' + name).emit('message', { msg: 'hello world!' });