【问题标题】:android multi player game over network安卓多人网络游戏
【发布时间】:2012-01-19 09:45:35
【问题描述】:

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

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

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

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

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

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

  4. 我也对如何实现我想要的全新建议持开放态度。我几乎可以编写任何代码,所以不要犹豫,让我知道一些更困难的实现网络通信的方法。

我还要提一下,我很乐意在我的情况下实施一种完全具体的方法,所以它可以是任何可以完成工作的方法,但我也在寻找更通用的方式来进行沟通客户端和服务器。这样我就可以编写一个界面/任何东西,并在其他 android 游戏、android 应用程序中重用代码。

我希望我能正确地提出问题,并且我会收到一些有价值的答案。

谢谢

【问题讨论】:

    标签: java android sockets networking network-programming


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 这可能是一个选项。我会调查的。我在谷歌搜索时也遇到了这个问题,只是没有将其视为最佳选择。我认为这些天游戏使用不同的东西。所以基本上你是在建议一个 REST java 服务器 + XMPP?是的,消息发送的频率很高——每秒。
    • 效果出奇的好。但是您必须权衡传输/解释 xml 代码而不是特定值的额外成本与所需的整个协议/库已经完成并经过多年测试这一事实。
    • 嗨。再次感谢您的回答,但我还有一些其他问题。 1) 由于我的用户是通过 XMPP 连接的,因此他们需要先使用密码/用户名进行注册,这我真的不喜欢。他们是否可以只指定一个用户名,这足以自动验证用户并将其放在玩家列表中。 2)我应该只使用当前会话的用户(不占用正确的会话,还是应该为每个新用户名创建一个新用户。如果是后者,那么数据库的大小会变得非常大。任何想法都是欢迎。
    • 我假设你想要某种形式的球员身份,比如用户名?如果是这样,您可以让客户端使用用户名作为密码、随机生成的用户名或设备 ID 登录,因为我认为根据协议需要密码。如果您不需要为用户保存任何数据,例如用户仅用于显示标识符(用户名),我认为最好的方法是在用户完成游戏并注销后将其从服务器中删除。
    • 用户名/密码毕竟只是用于识别网络中的单个用户。您可以在抽象层下向用户隐藏它,让您的服务器或您的客户端根据一些合适的因素来决定这些。最终由您决定如何控制。
    【解决方案2】:

    听起来 Android Cloud-to-Device-Messaging 可能是你需要的

    无需应用保持连接即可推送通知

    【讨论】:

    • 嗨。我忘了在我的帖子中提到这一点。这不是一个选项,因为 Google 可能会开始对发送的消息收费,但我不确定:每天可以发送的消息数量是否有限?另外,我也认为android中的网络游戏不使用这个,而是更复杂的东西。我可能错了。
    • "您的发件人帐户将被分配默认配额,目前相当于每天大约 200,000 封邮件"code.google.com/intl/sv-SE/android/c2dm/quotas.html
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多