在线游戏中玩框架longpolling

时间:2011-07-27 11:27:28

标签: java playframework comet websocket long-polling

我正在使用Play框架开发一个浏览器游戏,我肯定需要longpolling,但我不太明白如何使用它。 WebSockets对于这一点来说是完美的,但它还没有得到那么多浏览器的支持。

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

我还想知道的是,我应该如何跟踪所有这些开放的连接?现在,我在数据库的users表中只有一个online列,我更新了。每次有人连接时我都要更新数据库。有没有更好的方法来做到这一点,还是这样很好?

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

4 个答案:

答案 0 :(得分:7)

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

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

另一方面,

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

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

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

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

答案 1 :(得分:1)

在Websocket部分,您可以看到here(第一个答案),支持并不是那么糟糕,如果浏览器出现问题,您可以使用Javascript备份。这样可以简化您的方案,因为长时间轮询可能会更复杂。

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

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

答案 2 :(得分:0)

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

但我最近一直在研究和修补基于http的长轮询。 Websockets(如果可用)更适合实时消息!

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

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

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

答案 3 :(得分:0)

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