在服务器和客户端之间同步计时器 - 节点js / android / socket io
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在服务器和客户端之间同步计时器 - 节点js / android / socket io相关的知识,希望对你有一定的参考价值。
我有一个游戏,用户必须在10秒的间隔内回答问题。这意味着当10秒钟结束时,如果他/她尚未回答问题,则不允许用户回答问题。此时服务器也应该不允许用户回答问题,因为服务器也知道10秒已经过去。
为了确保有效性并确保客户端不以任何方式操作,我决定将计时器放在服务器上,只是将计时器显示给客户端(显示计时器很重要)。
问题是我如何向用户显示计时器,并确保计时器在客户端上有效。
当用户实际正在播放时,Socket IO处理客户端和服务器之间的交互,http处理用户在游戏中执行的所有其他操作(登录,注册,帐户,支付等)。
我的堆栈是android,java,node js server,socket io。我已经设置了所有,唯一的问题是在客户端和服务器上同步计时器时采取的方法。
我在想一种方法可能是提出一个问题,并基本上在套接字上设置一个变量(在服务器上)
var t = new Date();
t.setSeconds(t.getSeconds() + 12); //2 seconds extra for network lag
socket.allowed_time = t
然后将问题发送给客户端,并向用户显示10秒倒计时。每当客户端响应时检查当前时间是否大于socket.allowed_time。考虑到网络滞后,这种方法似乎不可靠。
像8球池我玩的游戏有两个用户之间的实时游戏,并且两个用户之间的时间同步(实时),我注意到网络延迟也影响了游戏。
我不认为有一种方法可以同时处理网络滞后1,以及2)应对假装有网络滞后的客户。
如果您不关心滞后的客户端/用户有时会受到惩罚,那么您只需在服务器端运行10秒计时器。如果在计时器关闭之前未收到客户的回复,则拒绝该回复。
您可以在客户端收到问题时启动用户的屏幕定时器。如果存在实质性延迟,则计时器可能不会达到零,直到(显着)回复为止。您可以通过估算两个方向的平均延迟并调整时钟的秒数来弥补这一点。
1 - ......没有“不公平地”惩罚滞后的客户。
以上是关于在服务器和客户端之间同步计时器 - 节点js / android / socket io的主要内容,如果未能解决你的问题,请参考以下文章
Next.js 和 Styled Components 在刷新时服务器和客户端之间不同步