【问题标题】:Detecting if client has disconnected检测客户端是否已断开连接
【发布时间】:2013-10-07 00:20:55
【问题描述】:

我正在使用 webapp2 Web 框架在 GAE 上开发一个 Web 应用程序。这是一个两人游戏,同时玩多个游戏实例。服务器充当在两台计算机之间传递游戏数据并对其进行验证的路径。 客户端仅通过 HTTP 请求与服务器通信。

为此,我将创建一个表格,在其中存储用户的 IP 地址、userId(使用 cookie)和用户名(如果用户已注册)以及他们所在的游戏实例的地址玩。

直到并且除非游戏结束(任一玩家获胜),否则我不会删除表中的条目,但我意识到,如果其中一个(或两个)玩家在游戏结束前断开连接或网络错误导致一名(或两名)球员退出。

我如何知道游戏不再处于活动状态,以便我可以从桌上删除条目并通知仍在等待对手移动的玩家?

【问题讨论】:

  • 有一定的keepalive进程。 http 是无状态的。
  • @DanielA.White 我不明白。你能告诉我怎么做吗?

标签: python web-applications webapp2


【解决方案1】:

你可以:

  • 在您的用户模型中添加last_action = DateTimeProperty(auto_now=true)
  • 在您的游戏模型中添加ended = DateTimeProperty()
  • 创建一个搜索所有带有last_action < now - x minutes 的用户的方法,并将所有带有该用户的游戏的ended 属性设置为现在
  • 创建一个方法来删除自 y 分钟以来结束的所有游戏
  • 通过任务和cron 定期运行此方法

但如果你的客户可以执行 javascript,你最好看看channel service

【讨论】:

  • 谢谢@greg。我需要问你这个问题:由于之前没有收到任何答案,我决定让客户端(浏览器)每隔几秒钟通过XMLHttpRequest 轮询一次服务器。在这种情况下,如果其他玩家已经移动,服务器将响应移动,否则只会在“已看到”行返回状态消息。并标记客户在场。如果客户端错过了 10 次左右的轮询,它将被视为断开连接。这种方法有漏洞吗?是更好还是更糟?为什么。
  • 按照你的方法,如果两个玩家断开连接(没有新的投票),你的游戏不会结束。
  • 是的,我希望不时运行另一个进程来清理数据库,我想知道如何做到这一点。
  • 每小时设置一个 cron 来获取和删除最后一次移动(或轮询)超过 x 分钟的游戏。见developers.google.com/appengine/docs/python/config/cron
猜你喜欢
  • 2014-04-14
  • 2013-07-27
  • 2011-07-08
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 2021-02-21
相关资源
最近更新 更多