7

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

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

如果我使用 on socket disconnect 事件,用户将不再在任何房间。是保留一组单独的用户的唯一方法,还是有一些我没有想到的聪明方法?

4

2 回答 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 会在断开连接事件时自动修剪房间。但是,如果您要执行特定操作,则可以使用此方法。

于 2012-12-21T16:44:37.923 回答
0

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

在连接或登录时:

socket.user = yourUser;

断开连接时:

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

有关向套接字对象和单个房间聊天客户端添加属性的示例,请参见此处:

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

于 2012-12-21T11:33:03.013 回答