关于向客户广播消息的逻辑问题

时间:2018-04-12 14:23:48

标签: node.js sockets socket.io

我目前正在使用套接字在Node js上开发游戏。

如果您可以拍摄多人游戏并拥有3个单独的房间。所以我进入网站,1号房间有16/16名玩家,所以我去了2号房间。这样的交易。

逻辑上,在房间1中运行的游戏的游戏信息应该只发送给房间1中的用户,所以就像这样。

this.socket.of('game').emit('updateGame', this.rooms);

我曾经测试过它或其他任何东西,但这将是它背后的一般逻辑。

它看起来服务器很重,因为它是一个快速移动的游戏,在更大的规模上,这可能有500个玩家,每个60fps。

另外,我可以向所有人发布所有游戏的信息

.attr("text-anchor", function(_, i) {
   return ["start", "middle", "end"][i]
})

并显示正确的一个客户端。

考虑到服务器的压力,效率,最佳实践等,在逻辑上最好的是什么。它似乎是第二个,但是当他们只玩1个错误时我想要将每个游戏/房间发送给客户端。

1 个答案:

答案 0 :(得分:0)

关于句柄加入存在空间或创建新房间我认为你可以在服务器端使用这样的Redis适配器:

const io = require('socket.io')(3000);
const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ host: 'localhost', port: 6379 }));

io.on('connection', function(client) {
    //Get allRooms by Redis Adapter
    io.of('/').adapter.allRooms((err, rooms) => {
        let statusJoinedRoom = false
        for (let room of rooms) {
            if (socket.id !== room) {
                let numClients = io.sockets.clients(room).length
                if (numClients <= MAX_CLIENTS_IN_ROOM) {
                    socket.join(room, () => {
                        console.log(`Joined room: ${room}`)
                        statusJoinedRoom = true
                        break
                    }
                }
            }
        }
        if (!statusJoinedRoom) {
            socket.join(`room${rooms.length+1}`, (){
                console.log('Created new room')
            })
        }
    })
})

工作流程为:Get all rooms - &gt; Check count clients in each Room - &gt; Join if count clients < MAX_CLIENTS_IN_ROOM - &gt; Create new room if all Rooms full

关于性能Redis缓存将帮助存储空间,客户端数据。通常情况下,这些数据将保存在Node线程的内存中。

关于同一会议室中所有客户的emit,您可以使用此

socket.to(socket.rooms).emit('hello', "to all clients in room except sender")

希望这有帮助!