通过互联网进行Android P2P(直接连接)(NAT后面)

时间:2012-04-04 15:39:37

标签: android sockets connection p2p

我正在开始一个小型项目,基本上是经典战舰游戏的多人游戏(与超过两个玩家一样)。

在我深入编码之前,我试图解决的一个问题是多个玩家之间的沟通问题。当前的可能性是使用中央HTTP服务器作为通信的中央集线器(与Android C2DM API结合以允许从HTTP服务器到设备的推送通信)。这似乎是一个很好的解决方案,因为从理论上讲,只要您能够访问互联网,无论您是否支持NAT,它都应该能够完美运行。

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

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

3 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:1)

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

请注意,这可能会实施,但可能会非常耗时,而且在您的情况下,成本/收益可能无法解决。

答案 2 :(得分:0)

你几乎被迫使用中间人。您可以查找Natblaster以获取一些机制,该机制可用于在某些NAT设备之间建立TCP连接,但这并不是您可以在Android中使用而无需同时使用两个设备的东西。即使这样,它也是实验性的。

最好的方法是使用现有的联邦邮件系统,如jabber。