【发布时间】:2012-01-19 09:45:35
【问题描述】:
我正在编写一个 Android 多人游戏,它基本上由一个服务器组成,客户端连接和交换消息。当玩家连接到服务器时,会返回一个玩家列表给他/她。然后玩家可以选择一个用户来挑战 - 当然他必须从玩家列表中选择一个玩家,该列表只包含连接的用户。
当玩家 1 挑战玩家 2 时,需要从玩家 1 向服务器发送消息,服务器又必须向玩家 2 发送消息,通知他挑战。然后玩家 2 可以接受/拒绝挑战。
我可以使用以下技术来实现这一点:
-
在 Java 套接字编程中使用自定义服务器/客户端。服务器基本上接受来自客户端的连接,为每个连接的客户端生成一个新线程。这样做的问题是:
- 需要打开从客户端到服务器的持久连接,这会浪费安卓手机的电池寿命。这并不是很大的限制,因为电池没有消耗那么多。
- 当我想要开发另一个游戏时,我必须从头开始重写客户端/服务器代码 - 还要选择另一个端口来监听传入的连接 - 整个概念变得相当难以维护。
- 我也担心这是不是这样。如果数千个客户端同时连接,那么为每个客户端生成另一个线程听起来相当多。但我猜PC游戏就是这样做的。不确定安卓。
-
使用 Java REST jersey 在 HTTP 之上构建客户端-服务器。如果服务器可以轻松地向客户端发送通知,这将是一个完美的解决方案。这里实际上有多个设计决策:
- 客户端每隔几秒就会拉动服务器以获取任何新数据/通知 - 这真的很糟糕,因为我们遇到了无响应、延迟等问题。
- 客户端可以向服务器发送等待请求,因此客户端只有在某些数据可用后才会收到响应。这样比较好,但是当两个通知一个接一个地需要发送给用户时,仍然会产生延迟。第一个通知会立即发送,因为客户端已经打开了一个连接,等待数据接收。但是我们必须等待客户端发起另一个长的 http 请求来接收第二个通知。由于需要连续向特定客户端发送多个通知,因此问题变得更大。
- 客户端可以发起一个 http 流,在处理请求时通信保持打开状态,因此服务器也可以随时向客户端发送多条消息。这里的问题是我不知道这在 Android 上的效果如何。我看过几个实现:
- Java jersey + 气氛:实际上并没有成功。这似乎是最有希望的,但我不想花太多时间在它上面,因为我什至不确定它是否能达到我想要的效果。
- Deacon:看起来很整洁,但是在看到他们官方网页上的视频教程后,我不确定它是否可以满足我的需求。当玩家 1 挑战玩家 2 时,它是否可以向玩家 2 发送通知,让其知道比赛请求?
如果两个玩家通过网络玩游戏,我很高兴知道其他多人游戏如何处理网络通信。
我也对如何实现我想要的全新建议持开放态度。我几乎可以编写任何代码,所以不要犹豫,让我知道一些更困难的实现网络通信的方法。
我还要提一下,我很乐意在我的情况下实施一种完全具体的方法,所以它可以是任何可以完成工作的方法,但我也在寻找更通用的方式来进行沟通客户端和服务器。这样我就可以编写一个界面/任何东西,并在其他 android 游戏、android 应用程序中重用代码。
我希望我能正确地提出问题,并且我会收到一些有价值的答案。
谢谢
【问题讨论】:
标签: java android sockets networking network-programming