Node.js 多节点多人游戏服务器
假设你正在制作一个反击服务器。我们有一个大厅和多个房间,在这里可以进行游戏 也就是说,我有3节点服务器,nginx负载均衡器,redis 我使用socket.io和redis适配器,因此我可以向任何服务器上的每个客户端发送消息 有一件事我不明白。例如,我有这样的东西:Node.js 多节点多人游戏服务器,node.js,nginx,redis,load-balancing,socket.io-redis,Node.js,Nginx,Redis,Load Balancing,Socket.io Redis,假设你正在制作一个反击服务器。我们有一个大厅和多个房间,在这里可以进行游戏 也就是说,我有3节点服务器,nginx负载均衡器,redis 我使用socket.io和redis适配器,因此我可以向任何服务器上的每个客户端发送消息 有一件事我不明白。例如,我有这样的东西: var currentGames = {}; socket.on('createGame', function(gameName){ var game = new Game(); game.addPlayer
var currentGames = {};
socket.on('createGame', function(gameName){
var game = new Game();
game.addPlayer(socket.id);
currentGames.push();
// ... Send to all clients, that game created and they can join
});
socket.on('joinGame', function(gameName){
currentGames[gameName].addPlayer(socket.id);
// ... Send to all players of this game, that player joined
});
socket.on('walk', function(gameName, coordinates){
currentGames[socket.id].walk(player, coordinates);
// ... Get all players positions and send to clients
});
class Game
{
gameName;
players = {};
score;
constructor(name){
this.gameName = name;
}
addPlayer(player){
players[name] = new Player(player);
}
walk(id, coordinates){
this.players[id].updatePosition(coordinates);
}
}
class player
{
id;
life = 100;
coordinates = {0,0,0};
kills;
death;
constructor(id){
this.id = id;
}
updatePosition(coords){
this.coordinates = coords;
}
}
例如,我刚刚编写了这段代码
假设,用户_1在节点1上,用户2在节点2上
若用户_1创建游戏,实例将被创建并保存在节点1上
所以当用户_2收到关于游戏的信息时,他点击了一个加入按钮,
客户端将向服务器发送请求,在节点2上不会有用户_1创建的游戏实例
我希望你能理解我在说什么(我的英语不好)
我猜,对于所有节点,游戏实例的对象必须是全局的。但我不知道怎么做
我是否应该使用redis或mongo或其他工具来存储游戏信息,而不是变量
我走错方向了吗?你也应该同步Redis中的游戏状态、房间和游戏实例。
我有一些笔记:
+实体状态-管理游戏状态,存储和设置,将游戏信息获取到Redis
+客户端状态-每个连接客户端都有客户端状态并与实体状态同步,游戏循环中的每个勾号,检查实体状态和客户端状态之间的差异,并将其发送到客户端并更新游戏客户端