java - 在在线游戏中玩框架longpolling

标签 java playframework comet websocket long-polling

我正在使用 play 框架开发浏览器游戏,我确实需要 longpolling,但我不太了解如何使用它。 WebSockets 将是完美的选择,但目前还没有那么多浏览器支持它。

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

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

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

最佳答案

首先,我认为您需要了解 Websockets 和长轮询之间的区别。

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

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

我的建议是研究聊天示例(因为它有长轮询和 Websockets 版本)。这将是启动和运行您的要求的最有效方式。

至于你最后的问题是如何通知其他玩家。在长轮询中,您只需使用一些 JSON 响应暂停的请求。使用 websockets,您可以将事件发送回客户端。同样,从聊天示例中可以非常清楚地理解这两种方法。

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

关于java - 在在线游戏中玩框架longpolling,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6843527/

相关文章:

Java DOM XML 解析::获取元素属性值

java - 发现以 Element 开头的无效内容

node.js - Node.js 有没有办法将数据库结果异步推送到客户端?

javascript - cometd 编程实现

java - 开关中的中断标签

java - 如何将变量从一个 java 文件拉到另一个文件?

json - 如何使用带有标记类型的 play-json 格式/读取/写入宏

基于请求参数的 Scala Play 运行时注入(inject)

scala play json未找到unapply或unapplySeq函数

gwt - 长轮询与流式传输大约 1 次更新/秒