通过网络的android多人游戏

时间:2011-12-13 14:08:51

标签: java android sockets networking network-programming

我正在编写Android多人游戏,它基本上由客户端连接和交换消息的服务器组成。当玩家连接到服务器时,玩家列表将返回给他/她。然后玩家可以选择要挑战的用户 - 当然他必须从玩家列表中选择一个仅包含已连接用户的玩家。

当玩家1挑战玩家2时,需要从玩家1向服务器发送消息,然后服务器必须向玩家2发送消息,通知他有关挑战的信息。然后,player2可以接受/拒绝挑战。

我可以使用以下技术来实现这一目标:

  1. 将自定义服务器/客户端与Java套接字编程一起使用。服务器基本上接受来自客户端的连接,为每个连接的客户端生成一个新线程。这个问题是:

    • 需要从客户端到服务器打开持久连接,浪费Android手机的电池寿命。这并不是一个很大的限制,因为电池没有消耗那么多。
    • 当我想要开发另一个游戏时,我将不得不从头开始重写客户端/服务器代码 - 同时选择另一个端口来监听传入的连接 - 整个概念变得相当难以维护。
    • 我也很担心这是否可行。如果有数千个客户端同时连接,则为每个客户端产生另一个线程会发出很多声音。但我猜这些PC游戏是这样做的。不确定android。
  2. 使用Java REST jersey在HTTP之上构建客户端 - 服务器。如果服务器可以轻松地向客户端发送通知,这将是一个完美的解决方案。这里实际上有多个设计决策:

    • 客户端每隔几秒钟就会向服务器提取任何新数据/通知 - 这真的很糟糕,因为我们遇到了无响应,延迟等问题。
    • 客户端可以向服务器发送等待请求,因此客户端只有在某些数据可用后才会收到响应。这是更好的,但是当两个通知一个接一个地需要发送给用户时仍然会产生延迟。第一个通知立即发送,因为客户端已打开连接,等待接收数据。但我们必须等待客户端发起另一个长http请求以接收第二个通知。问题变得更大,因为有多个通知需要连续发送到特定客户端。
    • 客户端可以启动http流,在处理请求时通信保持打开状态,因此服务器也可以随时向客户端发送多条消息。这里的问题是我不知道它在Android上的效果如何。我看了几个实现:
      • Java jersey +氛围:实际上没有成功实现它。这似乎是最有希望的,但我不想花太多时间,因为我甚至不确定它是否符合我的要求。
      • 执事:看起来非常整洁,但在他们的官方网页上看过视频教程后,我不确定它能做我需要的东西。当player1挑战player2时,它是否可以向player2发送通知,让它知道匹配请求?
  3. 如果两位玩家通过网络玩游戏,我会很高兴知道其他多人游戏如何处理网络通讯。

  4. 我也愿意接受一个全新的建议,即如何实现我的目标。我几乎可以编写任何代码,所以不要犹豫,让我知道一些更难以实现网络通信的方式。

  5. 我还要提一下,我很乐意在我的案例中实施一个完全具体的方法,因此它可以是完成工作的任何事情,但我也在寻找更通用的方法来进行沟通。客户和服务器。所以我可以编程一个接口/无论如何并重用其他Android游戏中的代码,Android应用程序。

    我希望我提出这个问题并且我会得到一些有价值的答案。

    谢谢

3 个答案:

答案 0 :(得分:2)

你应该看看XMPP。这是一个允许在用户之间发送xml数据的协议(最初是为聊天程序创建的) 它具有独立的客户端 - 服务器关系,因此您可以专注于开发适合手机的客户端应用程序,并根据您的需要开发不同的服务器。

协议上有大量可用的信息(我应该知道,我写了一篇关于在游戏应用程序中使用协议的论文),但你可以从looking it up on wikipedia开始查看它是否是你想要的。< / p>

aSmack是一个用于创建android xmpp-clients的库。设置它并让一切工作都需要一些调整,但一旦你这样做,它就会很整洁。

编辑:与建议使用C2DM的答案有关:
来自c2dm docs "Sending large numbers of C2DM messages"

  

您是否过于频繁地发送C2DM消息?如果您需要在短时间内经常与您的应用程序通信   时间,C2DM可能不是最好的解决方案。相反,考虑一下   实现XMPP或您自己的协议来交换消息,并使用   C2DM只发送初始通知。

答案 1 :(得分:0)

听起来Android Cloud-to-Device-Messaging可能就是您所需要的

在没有应用程序打开连接的情况下推送通知

答案 2 :(得分:0)

我会赞成一些消息传递技术 - 比如activeMQ,rabbitMQ,zeroMQ等等。在服务器端,你可能会坚持使用java或javascript(如
node.js) - 这样的解决方案将提供最大的性能和最小的延迟。

如果延迟不是那么重要,您也可以使用带有JSON的REST调用