有没有什么好的办法可以让服务器和客户端的时间一致!!

现在的做法是 进游戏拿服务器时间,和当前客户端时间算出一个差值,每次需要服务器时间的时候再用当前客户端时间和差值计算。

但是如果玩家修改了本地时间,同样会导致算出来的服务器时间不真实,导致一些功能错误。

这个问题应该是游戏中比较常见的。想问一下各位大佬用的什么解决方法

为什么每次需要服务器时间的时候再用当前客户端时间和差值计算, 如果要用服务器时间的地方为什么不完全以服务器时间为准

不能每秒都去取服务器时间吧

我是每次过几秒去请求一下服务器更新差值,还有假如差值太大了就判断用户修改了本地时间,提醒用户系统错误,强制不能进游戏

服务端每次交互都会给一个最新的时间,客户端一直更新差值就可以了。

这样也是不准确的吧。我是做的传奇,有些功能就要在人物等级>x且开服时间>y去开启的,如果玩家修改了本地时间,服务器还没更过来最新时间的时候,玩家升级了。这个功能就会被打开 <其实是错误的>

客户端改时间之后,差值就会变大了。每次取时间的时候都是客户端本地时间+差值=服务端时间。另外,客户端控制的东西,怎么样都会打开的。你这个开启应该在服务端。

我这边的处理是,每次重新唤起游戏界面时(从其它应用切回游戏的应用),就重新获取服务器时间差。

需要留意的是重新获取服务器时间差的过程(一般其实也就300ms左右),setTimeout 之类的时间计时器回调要暂停处理。

主要就是为了防止玩家改系统时间吧?
我之前是这样做的,启动游戏的时候拉取一次网络时间,并同时获取一下当前手机系统开机的时长(安卓和ios都有对应的api)。之后获取时间就通过每次去获取当前的开机时长 - 第一次获取的开机时长 + 第一次获取的网络时间戳来计算出当前的网络时间。
好处就是只需要获取一次网络时间,之后的就一直都是用的准确的网络时间

1.客户端如果在无操作场景 有用到游戏倒计时之类的, 则每几s轮询 查询最新服务器时间 或者心跳带时间过来, 差值过大提醒用户重新登录或者什么的,。
2.如果在你说的这种场景, 升级这些操作与时间相关的接口 返回信息时都必须带服务器时间回来 检验时间, 3.就算客户端时间乱了 服务端这边也不应该会触发后续场景 4.如果客户端人员不好操作, 则全权交给服务端验证时间

你这个小游戏用不了的
并且 ios需要加权限

谢谢。相对来说1还是比较可行, 2和3改动量太大了 :upside_down_face:

可以在心跳响应时同步下时间。这里有个参考示例

https://iohao.github.io/game/docs/examples/example_sdk_cocos

1赞

重要的事情走服务器接口判定(玩家的金币等数值、游戏功能的开放、领奖等), 不重要的事情用客户端时间+时间偏移量判定(客户端的UI显示、引导提示等), 每一个与服务器的通讯接口同步一次客户端与服务器的时间偏移量

协议包头里面带上时间戳也可以

1赞

获取1次服务器时间,并记录当前game.totalTime(游戏运行时间),之后只需要拿game.totalTime做差值计算就行了

1赞

这个我觉得可行!!!

谢谢大佬,现在项目的架构已经完全成熟且已经上线,针对不同玩家开放的不同功能就是前端做的校验,1这种大改动有点不现实。每一次服务器通讯同步的话可能还是无法避免错误的现象。不过楼下说的用游戏运行时间的差值来计算我觉得比较可行,不知道有什么弊端

不行的,还是无法达到精准的实时同步

  1. 如果即使功能开启,但是不影响玩家正常的数据,比如点击这个功能的各个按钮,后端会返回未开启状态,那么就无所谓了
  2. 如果这个功能是特别重要,就做成后端的,比如,开启了新功能,后端推送过来,功能未开启的请求数据,会返回错误提示
  3. 仅仅是同步时间,就在心跳协议里面加时间戳

后端不做验证,那么这个就是避免不了,改系统时间,破解改包