Java 基于网络的android多人游戏

Java 基于网络的android多人游戏,java,android,sockets,networking,network-programming,Java,Android,Sockets,Networking,Network Programming,我正在编写一个Android多人游戏,它基本上由一个服务器组成,客户端在其中连接和交换消息。当玩家连接到服务器时,玩家列表将返回给他/她。然后,玩家可以选择一个要挑战的用户-当然,他必须从玩家列表中选择一个玩家,该列表只包含连接的用户 当player1挑战player2时,需要将消息从player1传输到服务器,服务器必须向player2发送消息,通知他挑战。然后玩家2可以接受/拒绝挑战 我可以使用以下技术来实现这一点: 将自定义服务器/客户端与Java套接字编程结合使用。服务器基本上接受来自客

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

当player1挑战player2时,需要将消息从player1传输到服务器,服务器必须向player2发送消息,通知他挑战。然后玩家2可以接受/拒绝挑战

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

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

    • 需要有一个从客户端到服务器的持久连接,这会浪费android手机的电池寿命。这并不是一个很大的限制,因为电池并没有消耗太多
    • 当我想要开发另一个游戏时,我必须从头重写客户机/服务器代码——还要选择另一个端口来监听传入的连接——整个概念变得相当难以维护
    • 我也担心这是否是解决问题的方法。如果数千个客户机同时连接,那么为每个客户机生成另一个线程听起来相当多。但我猜电脑游戏就是这样做的。我不确定安卓系统
  • 使用JavaRESTJersey在HTTP之上构建客户机服务器。如果服务器可以轻松地向客户端发送通知,这将是一个完美的解决方案。这里实际上有多个设计决策:

    • 客户端每隔几秒钟就拉服务器获取任何新的数据/通知—这真的很糟糕,因为我们陷入了无响应、延迟等问题
    • 客户机可以向服务器发送一个等待的请求,因此客户机只有在某些数据可用后才能收到响应。这样更好,但当需要向用户发送两个通知时,仍然会产生延迟。第一个通知会立即发送,因为客户端已经打开了一个连接,等待数据接收。但是我们必须等待客户端启动另一个长http请求来接收第二个通知。问题变得更大,因为有多个通知需要一行发送到特定的客户端
    • 客户端可以启动http流,在处理请求时,通信保持打开状态,因此服务器也可以随时向客户端发送多条消息。这里的问题是,我不知道这在Android上的效果如何。我已经研究了几个实现:
      • Java jersey+atmosphere:没有成功地使其实际工作。这似乎是最有希望的,但我不想在上面花太多时间,因为我甚至不确定它是否符合我的要求
      • 执事:看起来很不错,但在他们的官方网页上看过视频教程后,我不确定它是否能满足我的需要。当玩家1挑战玩家2时,能否向玩家2发送通知,让其知道比赛请求
  • 如果两个玩家通过网络玩游戏,我很高兴知道其他多人游戏如何处理网络通信

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

  • 我还要提到的是,我很乐意在我的案例中实现一个完全特定的方法,所以它可以是任何可以完成工作的方法,但我也在研究客户端和服务器之间更通用的通信方式。这样我就可以编写一个界面/任何东西,并在其他android游戏、android应用程序中重用代码

    我希望我正确地提出了这个问题,并能得到一些有价值的答案

    谢谢你

    听起来Android可能正是你所需要的


    在应用程序不必保持连接打开的情况下推送通知

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

    协议上有大量可用的信息(我应该知道,我写了一篇关于在游戏应用程序中使用协议的论文),但是你可以先看看它是否是你想要的

    是一个用于创建android xmpp客户端的库。这需要一些调整来设置它,并让一切正常工作,但一旦你这样做了,它是整洁的

    编辑:与建议使用C2DM的答案相关:
    从:

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


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


    如果延迟不是那么关键,那么您也可以将REST调用与JSON一起使用。我忘了在我的帖子里提到那件事。这不是一个选项,因为谷歌可能会开始对发送的消息收费,我不确定:每天可以发送的消息数量是否有限?另外,我还认为android中的网络游戏不会