【问题标题】:Socket.io - Emit to array of socket idSocket.io - 发送到套接字 id 数组
【发布时间】:2015-08-01 14:20:15
【问题描述】:

我的数据库中存储了每个已连接用户的套接字 ID。当任何用户发布评论或状态时,我想使用存储在我的数据库中的套接字 id 向他/她的所有连接广播相同的内容。

我可以通过使用 io.sockets.connected[ socket.id ].emit('privateMsg', 'Hello! How are you?') 使用他/她的套接字 id 向单个客户端发送消息;

但是如何向我使用数据库中的选择查询生成的套接字 id 数组发出相同的值。

【问题讨论】:

  • 您是否在 server.js 上维护了套接字 ID 和用户 ID 数组。据我所知,每当您在新选项卡中刷新或加载页面时,它都会创建新的套接字 ID
  • 是的,我确实在 server.js 上维护了套接字 ID。每当页面加载时,我都会更新该特定用户的套接字 ID
  • socketsids.forEach(function(socketid){io.to(socketid).emit(...)}

标签: node.js socket.io


【解决方案1】:

您可以为每个连接并发射到它的套接字动态创建一个房间,而不必每次都遍历整个数组。像这样:

socketids.foreach(function(socketid){io.sockets.connected[socketid].join(sendingSocket.id);});

然后您可以通过执行以下操作从您的发送套接字向这些套接字发出:

sendingSocket.to(sendingSocket.id).emit('publicMessage', 'Hello! How are you?')

作为旁注,我认为在数据库中保留更改的套接字 ID 不是最好的方法,因为它们根本没有持久性。您可能想尝试为您的数据库找到更好的标识符。

【讨论】:

  • 如您所说,为每个连接的套接字动态创建一个房间。但是我已经为每个连接的用户在我的数据库中存储了套接字 id。现在从数据库中,我需要根据某些标准获取一些选定的用户。然后我需要从数据库中为这些选定的用户创建一个房间。那么如何为从数据库中选择的用户创建一个房间。
  • 房间在第一个套接字加入时创建。所以如果你需要创建一个房间让sockets加入,只需修改我给出的第一个代码示例,socket.io库就会生成一个房间。
【解决方案2】:

您可以使用rooms 的概念。每当套接字连接到达时,将连接加入房间。断开连接后,从房间中移除插座。

socket.on('connection', function () {
     socket.join('room1');
});  

socket.on('disconnect', function () {
     socket.leave('room1');
});

现在,当您想将消息发送到连接在房间上的套接字时,您可以将其广播到房间。

socket.broadcast.to('room1').emit('eventName', data);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-24
    • 2010-11-13
    • 1970-01-01
    • 2012-11-08
    相关资源
    最近更新 更多