Socket.io - 发送到 socket id 数组

4

我在数据库中存储了每个已连接用户的套接字ID。当任何用户发布评论或状态时,我希望使用存储在我的数据库中的套接字ID将其广播给他/她的所有连接。

我可以通过使用io.sockets.connected[socket.id].emit('privateMsg','Hello!你好吗?')向单个客户端发出消息。

但是,我该如何将相同的消息发送到我使用从数据库查询生成的套接字ID数组中的所有套接字ID?


你在 server.js 中维护了 socket id 和 user id 数组吗?据我所知,每当你刷新或在新标签页中加载页面时,都会创建一个新的 socket id。 - Mangesh Sathe
是的,我在我的server.js上维护了socket id。每当页面加载时,我都会更新该特定用户的socket id。 - TechMech
socketsids.forEach(function(socketid){io.to(socketid).emit(...)} - laggingreflex
3个回答

7
您可以使用“房间”概念。每当有一个套接字连接到达时,将连接加入到一个房间中。在断开连接时,从该房间中删除该套接字。
socket.on('connection', function () {
     socket.join('room1');
});  

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

现在,当您想向连接到房间的套接字发送消息时,可以将其广播到该房间。
socket.broadcast.to('room1').emit('eventName', data);

1

对于任何访问本线程的人。在Socket.io 3.x之后,我们可以将房间名称和套接字ID的数组传递给io对象,如下所示:

socketIds = [xlksdf09sdfsk,sdosdifns90sdf,..........]
io.sockets.to(socketIds).emit('hello','recieving all sockets')

roomNames = [roomA,roomB]
io.to(roomNames).emit('hello','recieves each member of the rooms')
// Event is also not emmitted multiple times on the client side 
// evern if single socketId is present in multiple rooms.

1
您可以为每个连接的socket动态创建一个房间,并向其发出信号,而无需每次循环整个数组。像这样:
socketids.foreach(function(socketid){io.sockets.connected[socketid].join(sendingSocket.id);});

然后,您可以通过以下方式从发送套接字向这些套接字发出信号:
sendingSocket.to(sendingSocket.id).emit('publicMessage', 'Hello! How are you?')

作为一个旁注,我认为将会改变的套接字 ID 存储在数据库中并不是最好的方法,因为它们根本没有持久性。你可能需要尝试找到更好的标识符来使用数据库。

如你所说,为每个连接的套接字动态创建一个房间。但是我已经在我的数据库中为每个已连接的用户存储了套接字ID。现在,根据某些条件,我需要从数据库中获取一些选定的用户。然后,我需要为这些从数据库中选择的用户创建一个房间。那么如何为从数据库中选择的用户创建一个房间呢? - TechMech
当第一个套接字加入时,将创建一个房间。因此,如果您需要为套接字创建一个房间,只需调整我提供的第一个代码示例,socket.io库将生成一个房间。 - Sander Thomassen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接