如何在断开连接时获取当前的插座空间?
How to get current room of socket on disconnect?
关于socket.io 1.3.7,如何获取socket on disconnect event的空间?
socket.on('disconnect', function() {
var currentRoom = ???
socket.broadcast.in(currentRoom).emit('user:left', socket.id);
});
您可以在开始时跟踪全局声明的数组中的所有套接字,然后在断开连接事件中检查该数组的索引。像这样:
var allClients = [];
io.sockets.on('connection', function(socket) {
allClients.push(socket);
socket.on('disconnect', function() {
// this is your leaving Socket object
var index = allClients.indexOf(socket);
var leaving_socket = allClients[index];
// this is the way to get the rooms in 1.3.7
console.log(leaving_socket.rooms);
}
}
您可以查看文档here
编辑
当然,leaving_socket.rooms
是一个数组而不是字符串,因为一个插座可以同时出现在多个房间中。这意味着您将不得不遍历该数组并找到您要查找的那个。插座也总是在与插座的 id 同名的房间中。
我通过在连接上设置 currentRoomId 变量解决了我的问题,所以我可以在断开连接时访问它。
io.sockets.on('connection', function(socket) {
var currentRoomId;
socket.on('join', function(roomId) {
socket.join(roomId);
currentRoomId = roomId;
});
socket.on('disconnect', function() {
socket.broadcast.in(currentRoomId).emit('user:left', socket.id);
});
}
房间在 'disconnect' 事件后已经离开,使用 'disconnecting' 事件,该事件将在 'disconnect' 事件发生之前发出,房间仍然可以进入。
它是这样工作的:
socket.on('disconnecting', function(){
var self = this;
var rooms = Object.keys(self.rooms);
rooms.forEach(function(room){
self.to(room).emit('user left', self.id + 'left');
});
});
关于socket.io 1.3.7,如何获取socket on disconnect event的空间?
socket.on('disconnect', function() {
var currentRoom = ???
socket.broadcast.in(currentRoom).emit('user:left', socket.id);
});
您可以在开始时跟踪全局声明的数组中的所有套接字,然后在断开连接事件中检查该数组的索引。像这样:
var allClients = [];
io.sockets.on('connection', function(socket) {
allClients.push(socket);
socket.on('disconnect', function() {
// this is your leaving Socket object
var index = allClients.indexOf(socket);
var leaving_socket = allClients[index];
// this is the way to get the rooms in 1.3.7
console.log(leaving_socket.rooms);
}
}
您可以查看文档here
编辑
当然,leaving_socket.rooms
是一个数组而不是字符串,因为一个插座可以同时出现在多个房间中。这意味着您将不得不遍历该数组并找到您要查找的那个。插座也总是在与插座的 id 同名的房间中。
我通过在连接上设置 currentRoomId 变量解决了我的问题,所以我可以在断开连接时访问它。
io.sockets.on('connection', function(socket) {
var currentRoomId;
socket.on('join', function(roomId) {
socket.join(roomId);
currentRoomId = roomId;
});
socket.on('disconnect', function() {
socket.broadcast.in(currentRoomId).emit('user:left', socket.id);
});
}
房间在 'disconnect' 事件后已经离开,使用 'disconnecting' 事件,该事件将在 'disconnect' 事件发生之前发出,房间仍然可以进入。
它是这样工作的:
socket.on('disconnecting', function(){
var self = this;
var rooms = Object.keys(self.rooms);
rooms.forEach(function(room){
self.to(room).emit('user left', self.id + 'left');
});
});