我有一个可以支持多个聊天室的应用程序。我试图弄清楚如何捕获用户在关闭浏览器选项卡时断开连接的特定房间,以便我可以更新在客户端的房间中加入了多少用户。现在似乎只能在全球范围内听取断开连接。如果我收到断开连接事件,我可以通过io.sockets.manager.roomClients[socket.id]
遍历用户所属的所有房间,使用io.sockets.clients(room).length
计算房间内的用户数量并将其发送到每个房间。如果我不确定该用户是否离开那个房间,重新计算一个房间里的人数似乎很愚蠢。
此外,我注意到在断开连接事件中,io.sockets.clients(room)
将显示仍然在数组中的断开连接的用户...我必须在该用户不再在数组中之前设置2秒的超时。这是一个已知的问题?他仍然显示disconnected:false
,所以我无法通过该属性。
这是我到目前为止所做的:
socket.on('disconnect', function(){
//find all rooms this disconnected user belongs too
var rooms = io.sockets.manager.roomClients[socket.id];
for(var room in rooms){
room = room.replace('/','');
if(room){
//rooms tend to keep the count around for a while, needs a timeout before user is removed from room
setTimeout(function(){
socket.broadcast.to(room).emit('count', io.sockets.clients(room).length);
}, 2000);
}
}
});