Node.JS Socket.IO将数据包发送到特定的连接ID

过去一周我一直在寻找这个特殊的问题,既然我找不到有关这个问题的信息(那个过时了),我只是决定去做其他的事情。 但现在我需要能够发送数据(我构build)到特定的客户端使用他们的ID使用node.js和socket.io连接到我的服务器。 我已经将ID存储在每个新连接的对象中。 我需要知道的是将其发送到我select的连接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 () { ); }); 

解决scheme:我想通过试验…你有什么待办事项是确保你存储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'); 

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

对的,这是可能的。

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

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

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

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

该解决scheme允许多台机器向任何用户发送事件。 在我看来,这也是相当简单和优雅的。