我想保证用户一次只能进入一个房间,但我很难实现这一点。我把问题归结为无法获得套接字当前所有房间的列表。
我目前的策略是做这样的事情:
io.on('connection', function(socket) {
console.log('A user just connected with id ' + socket.id);
socket.on("change room", function(data) {
// this SHOULD return a list of all rooms this user is in
var socketsRooms = socket.rooms;
console.log(socket.rooms) //{ '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }
console.log(typeof socket.rooms) // object
// Loop through the rooms and leave them
for (var room in socketsRooms) {
console.log('LEAVING ROOM: ', room);
socket.leave(room);
}
// Join the new room
socket.join(data.newroom);
});
socket.on('disconnect', function() {
console.log('user ' + socket.id + ' disconnected');
});
})
socket.rooms的文档中是否存在问题?它说应该返回一个套接字所连接的房间数组,但我将数据作为id对象返回。 EX: { '/#3tE4Up5PRbTfsU0JAAAD': '/#3tE4Up5PRbTfsU0JAAAD' }
...在我的情况下,我会期待类似['issues']
在Socket.io github page上,socket.rooms说明:
标识此套接字所在房间的字符串哈希,索引为 房间名称。
在标记为重复之前:
我已经查看了以下问题:
第一个问题的答案似乎是最常被攻击的解决方案,我很确定它会起作用,因为它假设解决方案是维护我们自己的列表,但我更喜欢使用socket.io而不是该方法的工作解决方案。 / p>
我在客户端使用带有angular2 beta的socket.io v1.4.5的最新版本(如果这样做有帮助的话)
答案 0 :(得分:1)
在socket.io中,每个套接字也连接到自己的房间。这个房间的名称与socket.id
相同。因此,离开房间时,请确保不要离开自己的房间。
for(room in socket.rooms){
if(socket.id !== room) socket.leave(room);
}
socket.join(data.newroom, function(){
console.log('rooms', socket.rooms); // here you'll see two rooms: one with socket.id and another with data.newroom
});