【问题标题】:Play framework longpolling in online game在线游戏中玩框架长轮询
【发布时间】:2011-10-14 04:26:36
【问题描述】:

我正在开发一个带有 play 框架的浏览器游戏,我肯定需要 longpolling,但我不太明白如何使用它。 WebSockets 非常适合这个,但目前还没有那么多浏览器支持它。

这是我想要做的:当用户登录并导航到 play 游戏控制器时,我想开始连接并保持打开状态。我想为所有在线用户执行此操作,以便我可以在网站上显示他们的列表,以便他们可以互相玩。我看过the documentation,但我不明白如何在我的情况下实现它。因为根本没有我想要计算的任何东西(在示例中他们正在生成一个 pdf),我只希望连接保持打开状态。

我还想知道的是,我应该如何跟踪所有这些打开的连接?现在,我在数据库的用户表中只有一个online 列,我对其进行了更新。所以每次有人连接我都必须更新数据库。有没有更好的方法来做到这一点,或者这样可以吗?

最后,假设上述所有工作。当玩家 A 选择玩家 B 一起玩时:我如何通知玩家 B?我只是发送一些 JSON 代码,并在播放器 B 一侧使用 javascript 更改页面,还是将他发送到完全不同的页面?当两个连接建立并开始游戏时,我不确定如何通信。

【问题讨论】:

    标签: java playframework comet websocket long-polling


    【解决方案1】:

    您可能还想看看Juggernaut 项目,它基于 node.js 和 Redis,为您提供“服务器和客户端浏览器之间的实时连接”。当使用像 Jedis 这样的 Java Redis 客户端时,您应该能够轻松地将整个东西与 Play 框架集成!

    【讨论】:

      【解决方案2】:

      我没有使用“播放”框架。

      但我最近一直在研究和修改基于 http 的长轮询。 Websockets,如果有的话,更适合实时消息!

      至于长轮询,我发现使用“货运卡车”类比帮助我非常有效地推理长轮询。这是我写的关于这个主题的一个小笔记:

      http://dvb.omino.com/blog/2011/http-comet-realtime-messages/

      也许你或未来的 greppers 会发现它很有用。

      【讨论】:

        【解决方案3】:

        首先,我认为您需要了解 Websockets 和 Long Polling 之间的区别。

        Websockets 创建一个连接并保持打开状态,直到浏览器终止会话,通过一些 javascript 或用户从页面移动。这将为您提供所需内容的所需性质。查看 Play 下载中的 Chat 示例将向您展示如何使用 Websockets 处理整个 Chat 应用程序。 继 Pere 关于 Play 的无国籍状态的回答之后。 Play 创建者建议单个 Websocket 连接,无论它打开多长时间以及来回发送多少请求,都被视为单个事务。因此,不需要在每个 Websocket 请求之间保存到数据库(再次,您可以看到在 Chat 示例中没有保存任何内容)。使用此方法,您需要在 Websocket 最终关闭时保存详细信息,或者实际上是所有 Websocket,具体取决于您的用例。

        另一方面,长轮询打开与服务器的连接,服务器只是等待,直到有东西要发送回客户端。如果您需要将任何数据推送到服务器,您可以将其作为单独的 AJAX 请求执行,因此您将有效地同时打开两个请求。您不一定知道用户何时注销,除非您在他们离开页面时发送请求,让服务器知道他们已经离开,但这并不总是成功的。长轮询可以工作,但它不像 Websockets 那样简洁,但正如你所说,这还没有得到广泛的支持。

        我的建议是研究 Chat 示例(因为它具有 Long Polling 和 Websockets 版本)。这将是满足您的要求的最有效方式。

        关于如何通知其他玩家的最终问题。在长轮询中,您只需使用一些 JSON 响应暂停的请求。使用 websockets,您可以将事件发送回客户端。同样,这两种方法都可以从 Chat 示例中清楚地看出。

        我在 Websockets 上也有 written a Blog post,它可以帮助你更好地理解这个过程。

        【讨论】:

        • 感谢您的帖子,它很有帮助。我仍然不确定 websockets 是否是我的正确选择(但我理解长轮询的问题)你知道任何使用套接字的大型 webgames 吗?让所有人都可以使用这款游戏显然是当务之急,我不知道 Websockets 能让我走多远
        • 我也有同样的困境,我现在要走很长的投票路线。很遗憾,因为 Websockets 是迄今为止更好的解决方案,但您可能会切断太多用户。那里有一些游戏,例如名为 Words2 (wordsquared.com) 的多人拼字游戏,但不确定它有多大!
        • wordsquared.com 使用Pusher(我为谁工作)。我们在不支持 WebSockets 的浏览器中使用 WebSockets 并回退到 Flash 套接字。由于 99% 的浏览器都支持 Flash(根据 adobe),我们认为这个解决方案使 WebSockets 生产就绪 - StackOverflow 上的许多人都同意(参见 WebSocket 就绪here)。我们还为聊天室风格的“谁在线”功能添加了内置 presence functionality
        【解决方案4】:

        在 Websocket 部分,您可以看到 here(第一个答案)支持还不错,如果浏览器出现问题,您可以使用 Javascript 后备。这将简化您的方案,因为长轮询可能更难以管理。

        关于跟踪问题,由于 Play 是无状态的,因此您必须将标志存储在数据库中,并在它们关闭连接时将其删除。否则你正在打破无国籍状态。

        关于通知,您必须向B发送一些消息,但不要将它们移动到另一个页面,因为它可能会造成混乱并导致不良的用户体验。使用 Json 弹出一些消息(在 div 中),提醒他们游戏开始或游戏请求。

        【讨论】:

        • 你会推荐使用链接中建议的 polyfill 之一,而不是 Play 的 Promise & await?还是两者兼而有之?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-03
        • 2011-11-09
        • 2019-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多