在网络游戏中玩框架长轮询



我正在制作一款带有游戏框架的浏览器游戏,我肯定需要长轮询,但我不太明白如何使用它。WebSockets将是完美的,但它还没有得到很多浏览器的支持。

这是我想做的:当用户登录并导航到play游戏控制器时,我想启动一个连接,并保持它打开。我想对所有在线的用户都这样做,这样我就可以在网站上显示他们的列表,这样他们就可以互相玩了。我看过文档,但我不明白如何在我的情况下实现它。因为根本没有什么我想要计算的(在这个例子中,他们正在生成一个pdf),我只希望连接保持打开。

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

最后,假设以上都有效。当玩家A选择玩家B时,我该如何通知玩家B ?我是发送一些JSON代码,然后用javascript改变玩家B的页面,还是发送给他一个完全不同的页面?当两个连接建立起来,游戏开始时,我不知道该如何沟通。

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

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

另一方面,

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

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

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

我还写了一篇关于Websockets的博文,这可能会帮助你更好地理解这个过程。

在Websocket部分,正如你在这里看到的(第一个答案),支持不是那么糟糕,如果浏览器有一些问题,你有一个Javascript的后备方案。这将简化您的场景,因为长轮询可能管理起来更复杂。

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

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

我没有使用"play"框架。

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

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

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

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

相关内容

  • 没有找到相关文章