节点.JS Socket.IO 将数据包发送到特定连接 ID
Node.JS Socket.IO sending packets to specific connection IDs
在过去的一周里,我一直在寻找这个特定的问题,由于我找不到有关该主题的任何信息(尚未过时),我只是决定做其他事情。 但是现在我需要能够使用他们的ID将数据(我构建的)发送到特定的客户端,这些客户端使用node.js和 socket.io 连接到我的服务器。 我已经将 ID 存储在每个新连接的对象中。 我需要知道的是一种将其发送到我选择的连接 ID 的方法。
像这样: 函数发送(数据, 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');
如果需要这样做,最简单的方法是构建和维护一个将 id 映射到连接的全局关联数组:然后,您可以在需要时查找相应的连接,只需使用常规的 send 函数即可。您需要一些逻辑来从数组中删除连接,但这应该不会太痛苦。
是的,这是可能的。
io.sockets.socket(id).emit('message', 'data');
您的解决方案有一个主要缺点:缩放。当你的应用需要更多一台机器时,你会怎么做?使用内部 ID 也可能很困难。我建议使用外部ID(如用户名)。
与这篇文章类似,我建议使用房间(与 Redis 一起允许缩放)。为每个新插座添加私人房间(例如,基于用户名)。代码可能如下所示:
socket.join('priv/' + name);
io.sockets.in('priv/' + name).emit('message', { msg: 'hello world!' });
此解决方案允许多台计算机向任何用户发出事件。在我看来,它非常简单和优雅。
相关文章:
- 如何在d3.js图库中基于nodes id连接边和节点
- Socket.IO socket.id 更改同一客户端而不重新连接
- AlloyUI图表生成器:按ID而不是名称连接节点
- 节点.JS Socket.IO 将数据包发送到特定连接 ID
- SignalR维护不同子页面之间的连接ID
- 在输入时重定向按javascript(但表单是硬连接到插件中的,所以必须使用输入类而不是ID)
- SignalR IUserIdProvider未为用户ID和连接ID映射调用
- 将jquery变量连接到字符串,以便添加id's转换为动态生成的输入字段
- 如何连接函数参数和输入 ID
- jquery/Javascript使用它来获取ID、名称和插入并连接字符串
- 套接字.Io:检查指定socket id的连接状态
- jQuery可排序连接列表-获取列表id和数据值的排序值
- 需要展开/折叠游戏摘要,并使用交换机连接两个id
- 如何在没有连接的情况下获得FB id
- 基于公共id连接两个js对象数组的功能方式
- 我需要将url与sharepoint列表tr id连接起来
- websocket使用会话id重新连接
- Phonegap 3.0 Facebook连接无效的应用程序id
- Trello API - 将卡与开发板连接,以根据开发板 ID 获取开发板名称
- jQuery:如何通过连接ID检索元素