【问题标题】:How to defer reading until writing is done?如何推迟阅读直到写作完成?
【发布时间】:2015-06-17 08:48:53
【问题描述】:

我正在使用 node.js、socket.io 和 MongoDB 制作多人游戏。

当玩家死亡时,他们可以在致命一击之前重新加载浏览器,并且即使已记录杀戮也仍然活着。我正在使用以下解决方案来保存/加载播放器:

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');
        }); 
    });
};

我认为发生的是“断开连接”事件开始写入,但在它完成之前“新玩家”事件触发,从数据库加载播放器并再次初始化它。所以读取发生在写入完成之前(这意味着他们将在当前发生之前从断开连接中获取播放器的状态)。

这是问题吗?如果没有,我的方法中是否还有其他可能导致这种情况的方法?如果这确实是问题,我该如何解决?

【问题讨论】:

  • 你能从断开更新回调中找到并杀死它们吗?

标签: javascript node.js mongodb websocket socket.io


【解决方案1】:

在多人游戏中,你需要在服务器端做重要的状态逻辑,或者至少在服务器端做一些状态验证。

您只是注意到这个“hack”,因为它很容易做到。你必须设计你的多人游戏服务器,以抵抗那些在使用 socket.io 编写自己的客户端方面经验丰富的人。基本上,这意味着您不应自动信任来自任何客户端的重要数据。

在您的情况下,您需要在死前最早的不归路发送请求。这可能会阻止大多数人执行此漏洞利用,但任何了解一些 javascript 并拥有 chrome 的人都能够阻止发送该请求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2021-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多