我是一名有帮助的助手,我会为您翻译以下内容。这是关于编程的:
这样做的问题在于,由于数据包到达的时间不同,服务端
所以我正在编写这个在线游戏,但是我在处理应该多久接受一个移动数据包方面遇到了困难。问题在于,如果不信任客户端,我无法让它正常工作。 基本上我的想法是:
客户端
/**** [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
与客户端/服务器中的不同。因此,如果客户端发送了两个移动数据包,第一个传输时间为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
标记为false