通过互联网(在NAT后面)的Android P2P(直接连接)

我开始一个小型项目,基本上是一个多人(如在两个以上的球员)变化的经典战舰游戏。

我在尝试解决编码之前要解决的一个问题是多个玩家之间的沟通问题。 目前的可能性是使用中央HTTP服务器作为通信的中心枢纽(加上Android C2DM API以允许从HTTP服务器到设备的推送通信)。 这似乎是一个很好的解决scheme,因为从理论上讲,只要你能访问互联网,无论你是否支持NAT,它都应该能够正常工作。

然而,所提出的解决scheme具有存在单点故障/额外负载(networking服务器)的缺点。 所以我想尝试其他select。 我想在客户端之间使用Sockets进行直接连接(Web服务器只是作为初始会议点),但是如果所有设备都在同一个networking中,那么这种方法只能工作得很好。 考虑到今天我们几乎总是在路由器的NAT后面,我怎么才能实现直接通信? 我一直在读洞打孔,但我找不到任何有据可查的好的库(包含很好的使用示例),并且可以在Android上运行。 另外,大多数(如果不是全部的话)冲孔技术(STUN,ICE等)只能用于UDP,这对于audio/video和实时多人游戏来说是好的,可以丢失一些消息,但是对于多人玩家基于游戏的保证交付每个回合的数据是非常重要的(这是UDP不可能的)。

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

Solutions Collecting From Web of "通过互联网(在NAT后面)的Android P2P(直接连接)"

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

你几乎被迫使用中介。 你可以查找一下Natblaster的机制,这个机制可以在一些NAT设备之间build立TCP连接,但是这并不是你可以在没有root设备的情况下使用的。 即使如此,这是实验性的。

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

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

作为一个说明,这是可能的,但可能会耗费时间,成本/收益可能不适用于你的情况。