24

我正在开始一个小项目,基本上是经典战舰游戏的多人游戏(如两个以上玩家)变体。

在我深入编码之前,我试图解决的一个问题是多个玩家之间的通信问题。当前的一种可能性是使用中央 HTTP 服务器作为通信的中央集线器(与 Android C2DM API 结合以允许从 HTTP 服务器到设备的推送通信)。这似乎是一个不错的解决方案,因为理论上只要您可以访问 Internet,无论您是否在 NAT 后面,它都应该可以正常工作。

然而,所提出的解决方案具有存在单点故障/额外负载(网络服务器)的缺点。所以我想尝试其他选择。我曾想过在客户端之间使用套接字进行直接连接(网络服务器仅用作初始会面点),但是只有在所有设备都在同一个网络中时这才能正常工作。考虑到今天我们几乎总是在路由器的 NAT 后面,我怎样才能实现直接通信?我一直在阅读有关打孔的信息,但我找不到任何有据可查的好库(包含好的使用示例)并且肯定可以在 Android 上运行。此外,大多数(如果不是全部)广泛使用的打孔技术(STUN、ICE 等)仅适用于 UDP,这对于可能丢失一些消息的音频/视频和实时多人游戏来说很好,

那么任何想法如何在 NAT 后面的Android设备之间实现可靠的打孔(最好通过 TCP) ?它不一定适用于 100% 的情况(可能不支持一些陌生的 NAT),但如果它适用于大多数情况会很好。

4

3 回答 3

10

通过 smack 在 gtalk 上使用 xmpp。您不必担心服务器和单点故障。让谷歌担心吧!我编写了俄罗斯方块,让它与使用 gtalk 作为通信层的两个玩家对战。http://code.google.com/p/tetrads-drop-lite/如果您想要更多播放器,可以尝试 MUC。

于 2012-04-04T15:46:42.647 回答
1

UDP 不是可靠的传递,但是您可以通过要求发送 UDP 数据包需要返回确认来使其可靠。这与其他一些要求一起,使 TCP 在 IP 上可靠(从一开始就不可靠)。

请注意,这是可以实施的,但可能会很耗时,而且成本/收益可能无法在您的情况下发挥作用。

于 2015-06-15T10:04:31.863 回答
0

你几乎被迫使用中介。您可以在 Natblaster 中查找可用于在某些 NATed 设备之间建立 TCP 连接的机制,但它不是您可以在 Android 中使用的东西,而无需生根两个设备。即便如此,它也是实验性的。

最好的可能是使用现有的联合消息传递系统,如 jabber。

于 2012-04-04T15:47:59.797 回答