我目前正在使用套接字在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/