我有一个游戏,用户必须在10秒内回答问题。这意味着10秒钟后,如果用户尚未回答问题,则不允许其回答问题。此时,服务器也不应允许用户回答问题,因为服务器也知道已经过去了10秒钟。
出于有效性考虑,并确保不以任何方式操纵客户端,我决定将计时器放置在服务器上,并仅向客户端显示计时器(显示计时器很重要)。
问题是如何向用户显示计时器,并确保计时器在客户端上有效。
Socket IO在用户实际玩游戏时处理客户端与服务器之间的交互,http处理用户在游戏中所做的所有其他操作(登录,注册,帐户,付款等)。
我的堆栈是android,同时带有java,node js服务器和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球池,在2个用户之间可以实时玩游戏,并且两个用户之间的时间(实时)是同步的,我注意到网络滞后也会对游戏产生很大影响。
答案 0 :(得分:0)
我不认为有两种方法可以1)处理网络滞后 1 ,2)处理客户端假装存在网络滞后。 / p>
如果您不关心滞后的客户端/用户有时会受到惩罚,则只需在服务器端运行10秒钟的计时器即可。如果在计时器关闭之前未收到客户的回复,则拒绝该回复。
当客户收到问题时,您仅可以启动用户的屏幕计时器。如果存在较大的滞后,则计时器可能直到到达(明显)为时已晚才达到零。您可以通过估算两个方向上的平均延迟并调整时钟的秒数来对此进行补偿。
1-...而不会“不公平地”惩罚滞后的客户端。