我希望能够静态地从房间中删除所有用户,从而 effectively 删除该房间。我的想法是,将来可能会创建另一个同名的房间,但我希望它是空的(没有前一个房间的侦听器)。
我不感兴趣自己管理房间状态,而是想知道是否可以利用 socket.io 的内部机制来实现这一点。这是否可能?(也请参见此问题)
我不感兴趣自己管理房间状态,而是想知道是否可以利用 socket.io 的内部机制来实现这一点。这是否可能?(也请参见此问题)
那是你想要的吗?
io.sockets.clients(someRoom).forEach(function(s){
s.leave(someRoom);
});
对于这个问题的最新回答,请使用Namespace.clients(cb)
功能来移除房间。第一个参数将作为错误对象传递给cb
回调函数(如果没有错误,则为null
),第二个参数将是socket ID列表。
它应该可以与 socket.io
v2.1.0
一起正常工作,不确定哪个版本是最早兼容的。
io.of('/').in('chat').clients((error, socketIds) => {
if (error) throw error;
socketIds.forEach(socketId => io.sockets.sockets[socketId].leave('chat'));
});
@See https://github.com/socketio/socket.io/issues/3042
@See https://socket.io/docs/server-api/#namespace-clients-callback
如果您正在使用 Socket.io v4 或更高版本,您可以使用以下代码:
io.in("room1").socketsLeave("room1");
//all the clients in room1 will leave romm1
//hence deleting the room automatically
//as there are no more active users in it
另外值得一提的是...
当套接字断开连接时,它们会自动离开它们所在的所有频道,并且您不需要进行任何特殊的拆除。
针对ROCK ON在4.X版本中的回答,如果您需要做更多的事情而不仅仅是离开房间,您可以执行以下操作:
const sockets = await io.in(room).fetchSockets();
sockets.forEach(s => {
// Do stuff
s.emit('host disconnected', room);
s.leave(room);
});
io.sockets.in(someRoom).leave(someRoom)
。 - Denys Séguretio.sockets.in(...).leave is not a function
。上述解决方案也不起作用,另一个错误提示是io.sockets.clients(...).forEach is not a function
。 - Naren