过去一周我一直在寻找这个特殊的问题,因为我找不到关于这个主题的任何信息(那已经过时了),我只是决定研究其他事情。但是现在我需要能够使用他们使用node.js和socket.io连接到我的服务器的ID将数据(我构建的)发送给特定客户端。我已经将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');
答案 0 :(得分:1)
如果你需要这样做,最简单的方法是构建和维护一个将id映射到连接的全局关联数组:然后你可以随时查找适当的连接,只需使用常规的send函数。你需要一些逻辑来从阵列中删除连接,但这不应该太痛苦。
答案 1 :(得分:1)
是的,有可能。
io.sockets.socket(id).emit('message', 'data');
答案 2 :(得分:0)
您的解决方案有一个主要缺点:缩放。当您的应用需要更多的一台机器时,您会做什么?使用内部ID也很困难。我建议使用外部ID(如用户名)。
与this post类似,我建议使用房间(与Redis一起允许缩放)。为每个新套接字添加私人空间(例如,基于用户名)。代码可能如下所示:
socket.join('priv/' + name);
io.sockets.in('priv/' + name).emit('message', { msg: 'hello world!' });
此解决方案允许多台计算机向任何用户发出事件。在我看来,它也非常简单和优雅。