如何在socket.io中删除房间

20
我希望能够静态地从房间中删除所有用户,从而 effectively 删除该房间。我的想法是,将来可能会创建另一个同名的房间,但我希望它是空的(没有前一个房间的侦听器)。
我不感兴趣自己管理房间状态,而是想知道是否可以利用 socket.io 的内部机制来实现这一点。这是否可能?(也请参见此问题
5个回答

23

那是你想要的吗?

io.sockets.clients(someRoom).forEach(function(s){
    s.leave(someRoom);
});

1
现在无法检查,但这也可能有效:io.sockets.in(someRoom).leave(someRoom) - Denys Séguret
3
@DenysSéguret io.sockets.in(room).leave(room)会抛出错误,提示io.sockets.in(...).leave is not a function。上述解决方案也不起作用,另一个错误提示是io.sockets.clients(...).forEach is not a function - Naren

17

对于这个问题的最新回答,请使用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


在2.2.0版本中对我有效。 - tremby
1
如果使用带有redis-adapter的集群,那么io.sockets.sockets[socketId]在所有进程中都可用吗? - CORSAIR
这个对我有用,而答案不起作用。 - Ali Has

8

如果您正在使用 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

5

另外值得一提的是...

当套接字断开连接时,它们会自动离开它们所在的所有频道,并且您不需要进行任何特殊的拆除。

https://socket.io/docs/rooms-and-namespaces/ (断开连接)


1
这并没有解决所描述的问题 - 也就是说,这些用户/套接字首先如何被移除?如果你只是想添加一些有用的信息,或许作为评论会更有价值? - Micheal Hill
1
这个想法是,将来可能会再次创建一个同名的房间,但我希望它是空的... 然后阅读我从文档中引用的内容。当套接字断开连接时,它会自动离开所有通道,因此不需要拆除。我看不出你投反对票的理由。抱歉,但你的论点对我来说并没有真正意义。也许我误解了? :) - Jakub Duchon
2
@JakubDuchon,感谢您对这个问题的贡献。您的答案帮助了我 :) 以及任何认为他们可能需要手动管理房间删除的人。 - zelusp

0

针对ROCK ON在4.X版本中的回答,如果您需要做更多的事情而不仅仅是离开房间,您可以执行以下操作:

const sockets = await io.in(room).fetchSockets();
sockets.forEach(s => {
  // Do stuff
  s.emit('host disconnected', room);
  s.leave(room);
});

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