以秒精度计时用户任务

Ore*_*n A 5 synchronization client-server timer server-side client-side

我正在构建一个网站,我需要对用户的任务进行计时,向他们展示时间,并跟踪他们完成任务需要多长时间.计时器应该精确到秒,整个任务应该需要大约3-4小时.
我还应该阻止用户伪造完成时间(没有涉及金钱,所以它不是真正的高风险,但存在一些风险).

目前我使用时间戳来跟踪用户何时开始,同时初始化基于JS的计时器,当用户完成我收到通知时,我计算当前时间和开始时间戳之间的差异 - 这种方法不好,用户的计时器和我的时差之间有几秒的差异(即我计算的时间花了用户完成任务,请注意:这只是在我的开发环境中测试过,因为我没有还有其他的环境......).
我考虑的另外两种方法是:
1.完全依赖客户端计时器(即JS),当用户完成任务时 - 发送加密时间(这样用户无法伪造开始时间).这似乎不太实际,因为我无法找到一种在客户端生成秘密密钥的方法,这将真正是"秘密".
2.完全依赖服务器端计时器,每秒发送"滴答".与其他两种方法相比,这似乎是很多服务器端工作(机器,而不是人类......例如,为每个"tick"访问数据库以获得开始时间),而且我也不确定它是否完全准确.

编辑:
这是算法措辞中现在发生的事情:

  1. 用户启动任务 - 服务器向用户发送任务ID并在db记录开始时间,初始化客户端计时器.
  2. 用户完成任务,他的计时器正在运行...
  3. 用户结束任务,停止计时器,并将用户的答案和任务ID发送到服务器.
  4. 服务器检索开始时间(使用收到的任务ID)并计算用户完成任务所需的时间.

问题 - 服务器计算的时间,客户端显示的时间不同.

任何见解都将非常感激.

Ric*_*son 2

如果我理解正确的话,问题是服务器和客户端时间略有不同,但它们总是如此。

所以我会稍微调整你的原始顺序如下:

  1. 用户启动任务 - 服务器向用户发送任务 ID 并在数据库中记录开始时间,初始化客户端计时器。
  2. 用户客户端通知服务器客户端开始时间;与服务器启动时间一起记录在数据库中
  3. 用户执行任务,他的计时器正在运行...
  4. 用户结束任务,计时器停止,并将用户的经过时间、答案和任务 ID 发送到服务器。
  5. 收到后,服务器记录传入请求时间,检索开始时间,计算用户完成服务器时间(开始/完成)和客户端时间的任务所花费的时间。
  6. 服务器确保客户端值在服务器验证时间的可接受范围内并使用客户端时间。如果客户端时间不在可接受的范围内(例如30秒),则使用服务器时间作为数字。

由于延迟、服务器负载等原因,时间上会略有差异,因此通过使用客户端值会更加准确且安全,因为这些值经过了健全性检查。


回答评论:

您只能拥有一种准确性,要么根据客户端/用户所看到的内容准确,要么根据服务器知道的内容准确。来自客户端的任何内容都可能受到污染,因此必须在某个地方做出妥协。您可以通过测量和偏移来最小化这种情况,使最终差异与开始差异在同一范围内,使用服务器时间,但它永远不会 100% 不可更改。如果这确实是一个大问题,那么存储时间的准确性就会降低。

如果您确实必须具有准确性和可靠性,那么唯一的方法是使用服务器时间并通过 ajax 定期抓取它进行显示,并使用本地计时器通过滑动调整算法来填补实际时间和报告时间之间的差距。