Node.js和Socket.IO - Rooms问题

7
考虑一个多聊天室应用程序。 用户可以加入多个房间(socket.join(room)),用户可以离开房间(socket.leave(room))。
当socket离开房间时,我会通知其他房间参与者。如果该socket当前在3个房间中,并且突然断开网站连接而没有以正确的方式离开房间,那么我如何通知这些房间用户已经离开?
如果我使用socket断开事件,则此时用户将不再在任何房间中。是保留单独的用户数组的唯一方法,还是有一些我没有想到的巧妙方法?

无论我做什么,根据socketio,房间里总是有两个用户。 - r3wt
2个回答

5
在断开连接事件期间,套接字仍然对您的进程可用。例如,这应该有效。
io.socket.on('connection', function(socket){
    socket.on('disconnect', function() {
       // this returns a list of all rooms this user is in
       var rooms = io.sockets.manager.roomClients[socket.id];
       for(var room in rooms) {
           socket.leave(room);
       }
    });
});

尽管socket.io在断开连接时会自动修剪房间,但实际上这并不是必需的。但如果您想执行特定操作,则可以使用此方法。

你觉得在客户端浏览器中使用window.onbeforeunload会不稳定吗? - Gabriel Gray
你可以这样做,但我认为这没有多大意义。你试图向给定房间中的其他用户发出警报,告诉他们此人已经离开。特定客户端的视图对其他任何人都没有影响,因此您唯一有用的事情是触发某些套接字事件,然后告诉所有其他用户他们已经离开。最好将其保留在服务器上并使用断开连接事件。 - Loourr
我不太理解你回答的第一部分...如果房间是动态创建的,我需要为每个房间创建一个 io.of(./room1).on 吗? - Gabriel Gray
我的第一个回答是错误的。除非您将房间视为命名空间,否则不要执行io.of(./room1).on(...)。相反,在断开事件上,您可以只调用 socket.leave(room) 就可以了,但是文档指出这会自动发生。 - Loourr

0

我假设socket是您的节点进程中的长期对象。如果是这种情况,那么当用户连接时,您可以轻松地在socket对象上添加对用户的引用。当您收到socket断开连接时,您不需要查找与会话相关联的用户,因为它已经存在。

在连接或登录时:

socket.user = yourUser;

在断开连接时:

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

请参考以下示例,了解如何向套接字对象添加属性以及创建单个房间的聊天客户端:

http://psitsmike.com/2011/09/node-js-and-socket-io-chat-tutorial/


一个socket就是一个socket.io的会话...没有别的(socket.id)。 - Gabriel Gray

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