所以我写了这个在线游戏,我有点难以处理我应该多久接受一次移动包。问题是,如果不信任客户端一些数据,我就无法让它工作,我就无法让它工作。基本上我的想法是:
客户
/**** [game/client] movePlayer ***/
boolean playerCanMove = Date.now() - player.lastMove > 1000;
if(playerCanMove){
player.lastMove = Date.now();
player.move(RIGHT);
client.send(new PacketMove(RIGHT));
}
服务器:
/**** [server] handle a move packet ****/
/** The only data received from the client is the direction(RIGHT) **/
/** the server has its own player.lastMove **/
let playerCanMove = Date.now() - player.lastMove > 1000;
if(playerCanMove){
player.lastMove = Date.now();
player.move(RIGHT);
}
else{
error = "Player is moving too fast";
}
这个问题是那个服务器player.lastMove
由于数据包到达所需的时间,客户端/服务器中的服务器将不一样。
因此,如果客户端发送 2 个移动数据包,第一个移动时间为 0 100ms
,第二个移动时间99ms
为服务器保存player.lastMove
有点晚,在这种情况下,误差幅度听起来也不太好。
有任何想法吗?
编辑:发送到服务器的唯一数据是为了示例而玩家想要移动的方向,它只是碰巧是相同的变量名。服务器有自己的player.lastMove
变量
解决方案 感谢@Lev M。
我还没有实现这个,但是我已经考虑过这个了,我找不到任何弱点,如果你这样做,请随时发表评论!
我认为可以肯定地说,客户端唯一可以做的就是更改时间戳,他也可以更改时钟,但这会产生相同的效果,所以我只考虑这个假设他正在更改数据包时间戳
添加一个额外的&& packet.timeStamp < server.clock
至
boolean isTimeStampValid = packet.timeStamp >= player.lastMove + 1000 && packet.timeStamp < server.clock
不会出错,它会将攻击 #1 标记isTimeStampValid
为错误