我正在编写一个Android多人游戏,基本上由一个服务器和客户端连接并交换消息组成。当玩家连接到服务器时,会向他/她返回一个玩家列表。然后,玩家可以选择要挑战的用户 - 当然,他必须从仅包含已连接用户的玩家列表中选择一个玩家。
当玩家1挑战玩家2时,需要从玩家1向服务器传输一条消息,然后服务器必须向玩家2发送一条消息,告知他有挑战。然后玩家2可以接受或拒绝挑战。
我可以使用以下技术来实现这一点:
我希望我表达了问题,并能收到一些有价值的答案。
谢谢。
当玩家1挑战玩家2时,需要从玩家1向服务器传输一条消息,然后服务器必须向玩家2发送一条消息,告知他有挑战。然后玩家2可以接受或拒绝挑战。
我可以使用以下技术来实现这一点:
使用Java套接字编程的自定义服务器/客户端。服务器基本上接受来自客户端的连接,为每个已连接的客户端生成一个新线程。这种方法存在以下问题:
- 需要从客户端到服务器保持持久连接,浪费了安卓手机的电池寿命。但是这并不是很大的限制,因为电池消耗并不多。
- 当我想开发另一个游戏时,我必须从头编写客户端/服务器代码 - 还要选择另一个端口来监听传入的连接 - 整个概念变得相当难以维护。
- 我也担心这是否是正确的做法。为每个客户端生成另一个线程听起来很多,如果成千上万的客户端同时连接,可能会出现问题。但我猜PC游戏是这样做的。对于安卓系统就不太确定了。
使用Java REST jersey在HTTP之上构建客户端-服务器。如果服务器可以轻松地向客户端发送通知,这将是一个完美的解决方案。实际上有多个设计决策:
- 客户端每隔几秒钟向服务器拉取任何新数据/通知 - 这非常不好,因为我们会遇到无响应、延迟等问题。
- 客户端可以向服务器发送等待请求,因此只有在某些数据可用后,客户端才会收到响应。这更好,但当两个通知一个接一个地发送给用户时,仍可能产生延迟。第一个通知会立即发送,因为客户端已经建立了一个开放的连接,等待接收数据。但我们必须等待客户端启动另一个长时间的HTTP请求以接收第二个通知。当需要按顺序向特定客户端发送多个通知时,问题会变得更加严重。
- 客户端可以启动HTTP流式传输,其中在处理请求时保留通信开放,因此服务器可以在希望时向客户端发送多个消息。这里的问题是我不知道这在安卓系统上运行得如何。我看过几个实现:
- Java jersey + atmosphere:没有成功使其正常工作。这似乎是最有前途的,但我不想花太多时间在它上面,因为我甚至不确定它是否做到了我想要的。
- Deacon:看起来相当不错,但在看完他们官方网页上的视频教程后,我不确定它能否完成我需要的功能。当玩家1挑战玩家2时,它能否向玩家2发送通知,让其知道比赛请求?
我很想知道其他多人游戏如何处理网络通信,如果两个玩家通过网络玩游戏。
我也愿意接受完全新的建议,以实现我想要的功能。我几乎可以编写任何东西,所以请不要犹豫,让我知道一些更困难的方式来实现网络通信。
我希望我表达了问题,并能收到一些有价值的答案。
谢谢。