互联网上的Android P2P(直接连接)(在NAT之后)



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

在深入编码之前,我试图解决的一个问题是多个参与者之间的通信问题。目前的一种可能性是使用中央HTTP服务器作为通信的中央集线器(与Android C2DM API结合,以允许从HTTP服务器到设备的推送通信)。这似乎是一个很好的解决方案,因为从理论上讲,只要你能访问互联网,它就应该完美地工作,无论你是否在NAT后面。

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

那么,有什么想法可以在NAT后面的Android设备之间实现可靠的打孔(最好是通过TCP)吗?它不必在100%的情况下工作(一些陌生的NAT可能不受支持),但如果它在大多数情况下工作就好了。

通过在gtalk上使用xmpp。您不必担心服务器和单点故障。让谷歌担心一下!我已经写了俄罗斯方块,使其与使用gtalk作为通信层的双人游戏。http://code.google.com/p/tetrads-drop-lite/如果你想要更多的玩家,你可以尝试MUC。

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

需要注意的是,这是可以实现的,但可能会很耗时,而且成本/效益可能无法在您的情况下实现。

您几乎被迫使用中介。你可以在Natblaster上查找一种机制,该机制可以在一些NATed设备之间建立TCP连接,但如果不根除这两个设备,你就无法在Android中使用它。即便如此,它也是实验性的。

最好的方法可能是使用像jabber这样的现有联邦消息传递系统。

最新更新