【问题标题】:Sync timer between server and client - node js / android / socket io服务器和客户端之间的同步计时器 - node js / android / socket io
【发布时间】:2018-12-12 19:48:17
【问题描述】:

我有一个游戏,用户必须在 10 秒内回答问题。这意味着当 10 秒结束时,如果他/她尚未回答问题,则不允许用户回答问题。此时服务器也不应该允许用户回答问题,因为服务器也知道 10 秒已经过去。

为了有效性和确保客户端不被以任何方式操纵,我决定将计时器放在服务器上并简单地向客户端显示计时器(显示计时器很重要)。

问题是我如何向用户显示计时器并确保计时器在客户端上有效。

Socket IO 在用户实际玩游戏时处理客户端和服务器之间的交互,http 处理用户在游戏中所做的一切(登录、注册、帐户、支付等)。

我的堆栈是带有 java、node js 服务器、socket io 的 android。我已经设置好了,唯一的问题是在客户端和服务器上同步计时器时要采取的方法。

我在想一种方法可能是提供一个问题并基本上像这样(在服务器上)在套接字上设置一个变量

 var t = new Date();
 t.setSeconds(t.getSeconds() + 12); //2 seconds extra for network lag
 socket.allowed_time = t

然后将问题发送给客户端并向用户显示 10 秒倒计时。每当客户端响应时,检查当前时间是否大于 socket.allowed_time。考虑到网络延迟,这种方法似乎不可靠。

像 8 ball pool i play lot 这样的游戏在 2 个用户之间进行实时游戏,并且两个用户之间的时间是同步的(实时),我注意到网络延迟也对游戏有很大影响。

【问题讨论】:

    标签: java android node.js server client


    【解决方案1】:

    我认为没有一种方法可以同时 1) 应对网络延迟1,以及 2) 应对客户假装存在网络延迟。

    如果您不关心滞后的客户端/用户有时会受到惩罚,那么您只需在服务器端运行 10 秒计时器。如果在计时器关闭之前没有收到客户的回复,那么它就会被拒绝。

    当客户收到问题时,您可以启动用户的屏幕计时器。如果存在大量滞后,则计时器可能不会达到零,直到(明显)为时已晚才能回复。您可以通过估算两个方向的平均延迟并调整时钟的秒数来弥补这一点。


    1 - ... 不会“不公平地”惩罚落后的客户。

    【讨论】:

    • 我想我可以忍受这样一种情况,即如果存在网络延迟,用户将受到惩罚。我相信网络延迟是我们生活的世界。这就涉及到至少确保服务器是唯一的事实来源的情况。这是我可以确定没有操纵的地方。
    猜你喜欢
    • 2020-05-26
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2013-11-16
    • 1970-01-01
    相关资源
    最近更新 更多