如何正确取消订阅 Socket.IO 房间并销毁它?

5

我有一个针对每个套接字的内部循环:

if (!chat.room.list[hash]) { // room has expired
    socket.leave(hash);
    delete chat.user.list[socket.store.data.id].rooms[hash];
    delete socket.store.data.inRooms[hash]; // delete room hash from user store
}

socket.leave(hash)无效 - socket仍会接收发送到hash房间的消息。

顺便提一下 - 如果我连接了客户端Anna和客户端Bob,则两者都会收到消息,但如果我重新连接客户端Bob,则Bob无法向Anna发送消息。

是否有完整的socket io API文档(因为我找不到socket.leave(room)的示例)?

编辑: 明白了! Socket IO使用斜杠保存房间句柄,因此您必须使用socket.leave('/'+hash)


5
你应该把你的解决方案添加为一个“答案”,这样它就不会被标记为“未回答”。请注意,在翻译过程中,我会尽力使内容更加通俗易懂,但不会改变原文的意思,并且不会提供任何其他解释或回复。 - timoxley
4个回答

7

socket.io中的房间是隐式创建和隐式删除的。当房间为空时,它们通常会自动删除。

是的,在内部房间名称前面会添加一个前导/,但您不需要在从房间中移除套接字时添加此内容。

尝试在创建房间时触发console.log(io.sockets.manager.rooms)以查看内部发生了什么。


什么是调试房间离开可能不会发生的最佳方法?即使客户端断开连接,房间仍然保持填充状态。使用Redis存储。 - Lassi Kinnunen

3
自0.8.7版本开始,我进行了尝试,似乎您不再需要添加/(斜杠)了。
socket.leave(hash)

运行良好。


1

SocketIO 1.0有Socket.prototype.leave(roomName)Socket.prototype.leaveAll()方法。

您不必手动删除房间:

在断开连接时,套接字会自动离开它们参与的所有频道,您无需进行特殊的拆除操作。 [从这里开始]


-1

有点跑题,但是回答你关于完整的socket.io文档的部分问题:并没有完整的文档。不过,如果你查看socket.io主页上的源代码,你可以找到一些简略的文档(查看源代码并使用CTRL+F搜索“rooms”)。我已经做过几次了。那里没有关于离开房间的内容,但有一些一般性的解释。

view-source:http://socket.io


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