如何推迟阅读直到写作完成?
How to defer reading until writing is done?
我正在使用 node.js、socket.io 和 MongoDB 制作多人游戏。
当玩家死亡时,他们可以在致命一击之前重新加载浏览器,并且即使记录了杀戮也仍然活着。我对 save/load 玩家使用以下解决方案:
socket.sockets.on('connection', onSocketConnection);
function onSocketConnection(client) {
util.log('New player has connected: '+client.id);
client.on('new player', function() {
db.collection('players').findOne({uuid: uid}, function(err, data) {
var player = new Player(data);
players.push(player);
});
});
client.on('disconnect', function() {
db.collection('players').update({uuid: player.uuid}, {$set: player}, {w: 1}, function(err, result) {
console.log('player written');
});
});
};
我认为发生的情况是 "disconnect" 事件开始写入,但在它完成之前 "new player" 事件触发,从数据库加载播放器并再次初始化它。因此读取发生在写入完成之前(这意味着他们将在断开连接之前从断开连接中获取播放器的状态)。
是这个问题吗?如果不是,我的方法中是否还有其他原因会导致这种情况?如果确实是这个问题,我该如何解决?
在多人游戏中,您需要在服务器上执行重要的状态逻辑,或者至少在服务器端执行某种状态验证。
您注意到这个 "hack" 只是因为它很容易做到。你必须设计你的多人游戏服务器以抵抗那些在使用 socket.io 编写自己的客户端方面经验丰富的人。基本上,这意味着您不应该自动信任来自任何客户端的重要数据。
在您的情况下,您需要在死亡前的最早 return 点发送请求。这可能会阻止大多数人执行此攻击,但任何知道一些 javascript 和 chrome 的人都能够阻止发送该请求。
我正在使用 node.js、socket.io 和 MongoDB 制作多人游戏。
当玩家死亡时,他们可以在致命一击之前重新加载浏览器,并且即使记录了杀戮也仍然活着。我对 save/load 玩家使用以下解决方案:
socket.sockets.on('connection', onSocketConnection);
function onSocketConnection(client) {
util.log('New player has connected: '+client.id);
client.on('new player', function() {
db.collection('players').findOne({uuid: uid}, function(err, data) {
var player = new Player(data);
players.push(player);
});
});
client.on('disconnect', function() {
db.collection('players').update({uuid: player.uuid}, {$set: player}, {w: 1}, function(err, result) {
console.log('player written');
});
});
};
我认为发生的情况是 "disconnect" 事件开始写入,但在它完成之前 "new player" 事件触发,从数据库加载播放器并再次初始化它。因此读取发生在写入完成之前(这意味着他们将在断开连接之前从断开连接中获取播放器的状态)。
是这个问题吗?如果不是,我的方法中是否还有其他原因会导致这种情况?如果确实是这个问题,我该如何解决?
在多人游戏中,您需要在服务器上执行重要的状态逻辑,或者至少在服务器端执行某种状态验证。
您注意到这个 "hack" 只是因为它很容易做到。你必须设计你的多人游戏服务器以抵抗那些在使用 socket.io 编写自己的客户端方面经验丰富的人。基本上,这意味着您不应该自动信任来自任何客户端的重要数据。
在您的情况下,您需要在死亡前的最早 return 点发送请求。这可能会阻止大多数人执行此攻击,但任何知道一些 javascript 和 chrome 的人都能够阻止发送该请求。