我正试图在我的服务器上用sockets.io配置一个有多个房间的1v1游戏。当用户创建一个房间时,会生成一个5个字母的随机字母数字标识符,用户就会加入这个房间。
function handleNewGame() {
let roomName = makeid(5);
client.join(roomName);
}
然后另一个用户应该使用房间名称加入。房间名称取自html主页中的一个标记,然后由一个函数发送。这是在服务器端上处理游戏加入的功能
function handleJoinGame(roomName) {
const room = io.sockets.adapter.rooms[roomName];
}
所有这些都被包裹在中
io.on('connection', client => {
}
问题是,在这一点上,在其他用户尝试加入之前,房间是未定义的。
console.log(room);
这让我无法定义。如果我试着打印出所有的房间,它确实存在,但方法找不到。我做错了什么?
实际上,io.sockets.adapter.rooms返回一个Map。这么说,我必须用带着钥匙进入房间
const room = io.sockets.adapter.rooms.get(roomName);
我已经解决了这个问题。
暂时忘记库。从概念上讲,room
只是一组用户。使用for循环向其广播的套接字连接的数组。它应该配有room manager
,因为你想有很多房间,否则你就只能有一个房间。
让我们假设一个数组对象。
var roomManager = {
"room12345" : [socket1, socket2, socket5],
"room76432" : [socket3, socket4],
}
当socket1
想要广播时,你知道它的房间room12345
,所以你向那个房间里的所有其他人广播。
所以实际上你可以很容易地自己实现这个逻辑。