考虑多聊天应用程序。用户可以加入多个房间(socket.join(room)
),用户可以离开一个房间(socket.leave(room)
)。
当套接字离开房间时,我通知其他房间参与者。如果套接字当前在 3 个房间中,并且他突然断开与网站的连接而没有以正确的方式离开房间,我如何通知这些房间用户已经离开?
如果我使用 on socket disconnect 事件,用户将不再在任何房间。是保留一组单独的用户的唯一方法,还是有一些我没有想到的聪明方法?
考虑多聊天应用程序。用户可以加入多个房间(socket.join(room)
),用户可以离开一个房间(socket.leave(room)
)。
当套接字离开房间时,我通知其他房间参与者。如果套接字当前在 3 个房间中,并且他突然断开与网站的连接而没有以正确的方式离开房间,我如何通知这些房间用户已经离开?
如果我使用 on socket disconnect 事件,用户将不再在任何房间。是保留一组单独的用户的唯一方法,还是有一些我没有想到的聪明方法?
在断开连接事件期间,您的进程仍然可以使用套接字。例如,这应该工作
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.user = yourUser;
断开连接时:
socket.on('disconnect', function(){
socket.leave(room, socket.user);
}
有关向套接字对象和单个房间聊天客户端添加属性的示例,请参见此处:
http://psitsmike.com/2011/09/node-js-and-socket-io-chat-tutorial/