Javascript Node.js&;Socket.IO-房间问题

Javascript Node.js&;Socket.IO-房间问题,javascript,node.js,socket.io,Javascript,Node.js,Socket.io,考虑多聊天应用程序。 用户可以加入多个房间(socket.join(房间)),用户可以离开房间(socket.leave(房间)) 当插座离开房间时,我会通知其他房间参与者。如果插座当前位于3个房间中,并且他突然断开了与网站的连接,而没有以正确的方式离开房间,我如何通知这些房间用户已离开 如果我处理on socket disconnect事件,那么此时用户将不再在任何房间。是保持一个单独的用户数组的唯一方法,还是有一些我没有想到的聪明方法?我假设套接字在节点进程中是一个长期存在的对象。如果是这种

考虑多聊天应用程序。 用户可以加入多个房间(
socket.join(房间)
),用户可以离开房间(
socket.leave(房间)

当插座离开房间时,我会通知其他房间参与者。如果插座当前位于3个房间中,并且他突然断开了与网站的连接,而没有以正确的方式离开房间,我如何通知这些房间用户已离开


如果我处理on socket disconnect事件,那么此时用户将不再在任何房间。是保持一个单独的用户数组的唯一方法,还是有一些我没有想到的聪明方法?

我假设套接字在节点进程中是一个长期存在的对象。如果是这种情况,那么当用户连接时,您可以轻松地在套接字对象上添加对用户的引用。当您获得套接字断开连接时,您不需要查找会话关联的用户,因为它将在那里

连接或登录时:

socket.user = yourUser;
断开连接时:

socket.on('disconnect', function(){
  socket.leave(room, socket.user);
}
有关向套接字对象和单室聊天客户端添加属性的示例,请参见此处:


在断开连接事件期间,套接字仍可用于您的进程。例如,这应该有效

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会在断开连接事件时自动删除。但是,如果希望执行特定操作,则可以使用此方法。

套接字是socket.io会话…仅此而已(socket.id)在客户端浏览器中使用window.onbeforeuload如何?你认为它会不稳定吗?你可以这样做,但我认为这没有多大意义。您试图提醒给定房间中的其他用户此人已离开。特定客户端的视图对其他任何客户端都没有影响,因此您可以做的唯一有用的事情是触发一些套接字事件,然后告诉所有其他用户他们离开了。最好将其保留在服务器上并使用断开连接事件。我不太理解您回答的第一部分。。。如果房间是动态创建的呢?我是否必须为它们中的每一个创建(./room1).on的io?我的第一个答案是off。除非您将房间视为名称空间,否则您不会希望在(…)上执行(./room1).io.of(./room1).on(…)。相反,您可以在断开连接事件上调用
socket.leave(room)
,但指出这将自动发生。嗯,根据socketio的说法,无论我做什么,房间中总是有两个用户