如何正确访问 socket.io 中插座连接的房间列表?
How to properly access the list of rooms a socket is connected to in socket.io?
所以我试图在用户与套接字服务器断开连接时向特定房间发送通知。我的服务器端有这个:
socket.on('disconnect', function() {
for (room of socket.rooms) {
console.log("Found a room: " + room)
//going to try to emit to the rooms the client is connected to here.
}
console.log("DISCONNECTED USER: " + socket.id);
});
这应该会打印出插座当前连接到的房间列表,但是当我让插座加入房间然后断开连接时,打印出来的只是“DISCONNECTED USER: myID”。不太确定该怎么做。
问题是 socket.rooms
在触发断开连接事件处理程序时已经被清空。
我知道解决这个问题的唯一方法是单独记录你把插座放在哪个房间。因为只有你的服务器可以把它放在一个房间里,你可以访问添加到房间或从房间中删除它的代码。然后,当您收到 disconnect
事件时,您将拥有自己的房间列表。
这是一个例子:
io.on('connection', (socket) => {
socket.myRooms = new Set();
// whatever message you use to add a socket to a room
socket.on('addToRoom', (roomName) => {
socket.join(roomName);
// update our shadow copy of the rooms list
socket.myRooms.add(roomName);
});
// whatever message you use to remove a socket from a room
socket.on('removeFromRoom', (roomName) => {
socket.leave(roomName);
// update our shadow copy of the rooms list
socket.myRooms.delete(roomName);
});
socket.on('disconnect', () => {
for (let room of socket.myRooms) {
console.log("Found a room: " + room)
io.to(room).emit(...);
}
console.log("DISCONNECTED USER: " + socket.id);
});
});
所以我试图在用户与套接字服务器断开连接时向特定房间发送通知。我的服务器端有这个:
socket.on('disconnect', function() {
for (room of socket.rooms) {
console.log("Found a room: " + room)
//going to try to emit to the rooms the client is connected to here.
}
console.log("DISCONNECTED USER: " + socket.id);
});
这应该会打印出插座当前连接到的房间列表,但是当我让插座加入房间然后断开连接时,打印出来的只是“DISCONNECTED USER: myID”。不太确定该怎么做。
问题是 socket.rooms
在触发断开连接事件处理程序时已经被清空。
我知道解决这个问题的唯一方法是单独记录你把插座放在哪个房间。因为只有你的服务器可以把它放在一个房间里,你可以访问添加到房间或从房间中删除它的代码。然后,当您收到 disconnect
事件时,您将拥有自己的房间列表。
这是一个例子:
io.on('connection', (socket) => {
socket.myRooms = new Set();
// whatever message you use to add a socket to a room
socket.on('addToRoom', (roomName) => {
socket.join(roomName);
// update our shadow copy of the rooms list
socket.myRooms.add(roomName);
});
// whatever message you use to remove a socket from a room
socket.on('removeFromRoom', (roomName) => {
socket.leave(roomName);
// update our shadow copy of the rooms list
socket.myRooms.delete(roomName);
});
socket.on('disconnect', () => {
for (let room of socket.myRooms) {
console.log("Found a room: " + room)
io.to(room).emit(...);
}
console.log("DISCONNECTED USER: " + socket.id);
});
});