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

时间:2011-08-29 10:09:52

标签: javascript node.js websocket socket.io

我为每个套接字都有一个内部循环:

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)什么都不做 - 套接字仍会收到发送到hash房间的消息。

作为旁注 - 如果我与客户端Anna和客户端Bob连接 - 都接收消息,但如果我重新连接客户端Bob - Bob无法向Anna发送消息。

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

编辑: 得到它了!套接字IO使用斜杠保存房间句柄,因此您必须使用socket.leave('/'+hash)

4 个答案:

答案 0 :(得分:4)

socket.io中的房间是隐式创建并隐式删除的。基本上它们在空的时候会被自动删除。

是的,前面的/会在内部添加到房间名称中,但您需要添加此项以从房间中移除套接字。

每当创建一个房间时,尝试触发console.log(io.sockets.manager.rooms)以查看内部发生的事情。

答案 1 :(得分:3)

从0.8.7开始,我尝试了它,似乎你不必再添加/(斜杠)了

socket.leave(hash)

工作得很好。

答案 2 :(得分:1)

SocketIO 1.0有Socket.prototype.leave(roomName)Socket.prototype.leaveAll()

而且您不必手动删除房间:

  

断开连接时,插座会自动离开所有通道,并且不需要特别拆卸。 [From here]

答案 3 :(得分:0)

对切线进行排序,但要回答关于完整socket.io文档的问题部分:不过,如果您查看socket.io's home page上的源代码,可以找到一些稀疏文档(查看“房间”的来源和CTRL + F)。我已经好几次了。在那里留下房间没什么,但有一些一般的解释。

视图-出处:http://socket.io