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

25

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

在我开始编码之前,我试图解决的一个问题是多个玩家之间的通信问题。当前的可能性是使用中央HTTP服务器作为通信的中心枢纽(再加上Android C2DM API,以允许从HTTP服务器向设备推送通信)。这似乎是一种不错的解决方案,因为理论上只要您可以访问互联网,它就应该完美工作,无论您是否在NAT后面。

但是,所提出的解决方案的缺点是存在单点故障/额外负载(Web服务器)。因此,我想尝试其他选项。我考虑使用套接字直接连接客户端(Web服务器仅用作初始会议点),但是如果所有设备都在同一网络中,则这仅适用于良好的运行。考虑到今天我们几乎总是在路由器的NAT后面,如何实现直接通信?我一直在阅读关于“打洞”的文章,但我找不到任何良好记录(包含良好使用示例)并且肯定适用于Android的库。此外,大多数(如果不是全部)广泛可用的打洞技术(STUN,ICE等)仅适用于UDP,这对于可以丢失一些消息的音频/视频和实时多人游戏来说还不错,但是对于一个多人轮流进行的游戏,重要的是保证每轮数据的传递(这是直接使用UDP不可能实现的)。

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


1
Win Myo Htet提出的解决方案具有很大的潜力(它使用了Google自己的基础设施)。然而,我仍然对Android上TCP和/或UDP打洞的良好解决方案感兴趣。 - petersaints
1
你最终得到了什么,@petersaints? - kishu27
3个回答

10

使用Smack通过Gtalk使用XMPP。您不需要担心服务器和单点故障。让Google来操心吧!我编写了俄罗斯方块,使其可以使用Gtalk作为通信层来进行两个玩家之间的对战。http://code.google.com/p/tetrads-drop-lite/如果你想要更多的玩家,可以尝试MUC。


我也考虑使用XMPP。你用的是哪个版本的Smack?原始项目似乎不是为Android构建的,但有一些端口。此外,通过XMPP发送数据容易吗?你只能发送文本还是可以发送二进制数据? - petersaints
1
我不使用二进制文件,而是源代码,因此我必须进行一些更改。你可以将二进制文件作为两个玩家之间的文件传输发送,而不是发送到MUC。然而,由于谷歌实现协议和Smack本身实现的差异,此时的二进制传输并不太健壮。好消息是,新版Smack最近发布,它已经解决了文件传输问题,我听说过。不过我还没有检查过。 - Win Myo Htet
没问题,不用担心答案。你可以等待其他人给你提供替代建议。如果你得到了不同的答案并接受了它,请联系我,因为我也很感兴趣。 - Win Myo Htet
好的选择是使用谷歌基础设施。 XMPP和推送通知的混合使用解决了问题。但是遗憾的是,不能进行更直接的方法。我只希望IPv6最终解决了处理NAT的问题。 - petersaints
@WinMyoHtet 我有几个问题,也许你可以从你的个人经验中回答。我不确定如何聊这些问题。如果你有时间进行一些问答交流,请回复。 - kishu27
显示剩余2条评论

1

UDP不是可靠的传输方式,但是可以通过要求发送UDP数据包需要返回确认来使其变得可靠。这与一些其他要求一起,是使TCP在IP上可靠(而IP本身是不可靠的)的原因。

需要注意的是,尽管可以实现这一点,但可能需要耗费大量时间,成本效益可能在您的情况下无法达到。


0

你几乎被迫使用中间件。你可以查找Natblaster以获取一种机制,该机制可以用于在某些NAT设备之间建立TCP连接,但这不是你可以在Android上使用的东西,除非同时ROOT两个设备。即使如此,它也是实验性的。

最好的方法可能是使用现有的联邦消息系统,例如jabber。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接