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

如果您能想象多人游戏并拥有3个单独的房间。所以我进入网站,房间1有16/16玩家,所以我去房间2。

从逻辑上讲,在1号房间中运行的游戏的游戏信息应仅发送给1号房间中的用户,因此类似。

for (var i = 0; i < this.rooms.length; i++){
     for (var j = 0; j < this.rooms[i].players; j++){
         io.sockets.connected[this.rooms[i].players[j].socketid].emit('updateGame', this.rooms[i]);
     }
}

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

由于它是一款快速发展的游戏,因此看起来非常耗费服务器资源,在更大的范围内,每60fps可能会有500名玩家。

或者,我可以将所有游戏的信息发送给所有人
this.socket.of('game').emit('updateGame', this.rooms);

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

在逻辑上最好考虑服务器的压力,效率,最佳实践等。这似乎是第二种,但是想到将每个游戏/游戏室发送给客户端时,如果他们只玩1个游戏,那我就有点烦恼了。

最佳答案

关于句柄联接存在房间或创建新房间,我认为您可以在服务器端使用Redis Adapter这样:

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-> Check count clients in each Room-> Join if count clients < MAX_CLIENTS_IN_ROOM-> Create new room if all Rooms full
关于性能Redis缓存将帮助存储室,客户端数据。在正常情况下,这些数据将保存在Node线程的内存中。

关于emit到同一房间中的所有客户,您可以使用此
socket.to(socket.rooms).emit('hello', "to all clients in room except sender")

希望对您有所帮助!

关于node.js - 有关向客户端广播消息的逻辑问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49799086/

10-13 08:09
查看更多