将共享对象附加到Socket.io会议室

时间:2019-08-22 04:56:16

标签: node.js sockets redis socket.io socket.io-redis

我正在创建一个具有多个游戏室的多人游戏,并且我想为每个房间关联一个游戏对象(或游戏状态);我正在使用NodeJS,Socket.io,socket.io-redis(不确定是否需要这个)。

为了更清楚一点,我也在使用Typescript。

我尝试使用socket.io-redis'remoteJoin()函数,并通过使用成功地将游戏对象设置为房间

io.of('/').adapter.rooms[<roomId>].game = Game

但是,我读到这不是设置房间宽对象的正确方法。

创建房间的事件

socket.on('create-game', (createData: any) => {
    this.io.of('/').adapter.remoteJoin(socket.id, createData.roomId, (err: any) => {
        let player = new Player(createData.username)
        let game = new Game(createData.roomId)

        game.addPlayer(player)

        this.io.of('/').adapter.rooms[createData.roomId].game = game
    })
})

加入房间的活动

socket.on('join-game', (joinData: any) => {
    this.io.of('/').adapter.remoteJoin(socket.id, joinData.roomId, (err: any) => {
        let player = new Player(joinData.username)
        let game = this.io.of('/').adapter.rooms[joinData.roomId].game as Game

        game.addPlayer(player)
    })
})

create-game事件发生了什么:

  1. 传入的数据用于创建Player
  2. 和一个Game对象
  3. 然后将player添加到game对象
  4. 最后,game对象被添加到房间中

join-game事件发生了什么:

  1. 传入的数据用于创建Player
  2. 通过从房间检索Game对象来创建
  3. player已添加到游戏对象

无数天/周后?搜索时,我偶然发现了这个Stackoverflow线程:socket.io, how to attach state to a socket room

这个答案是说基本上不做我上面的事情。 他们的建议是创建自己的数据结构(不确定如何开始这样做)。

我找到的其他答案说,只是在服务器中创建一个全局变量,但是同样,其他人也说这是不好的做法(我也认为)。

另一个流行的答案是将游戏存储在Redis中,但是Redis无法容纳复杂的Javascript对象。我现在知道Redis可以通过hmset()函数来保存哈希数据,但是我发现它不能与像Game对象这样复杂,带有函数,构造函数和getter / setter的对象一起使用。

另一个突出的答案是仅在“回合”之后将游戏存储到数据库中,但是在我的情况下,一旦游戏结束,房间就关闭了,相关的游戏也被破坏了;我不需要从“保存游戏”的角度坚持游戏。

1 个答案:

答案 0 :(得分:0)

这是一个好问题!我也对此很好奇。有人知道答案吗?