2012-04-04 129 views
15

我开始一个小型项目,基本上是一个多人游戏(如两名以上玩家)的变体经典战舰游戏。安卓P2P(直接连接)通过互联网(在NAT后面)

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

然而,所提出的解决方案具有存在单点故障/额外负载(web服务器)的缺点。所以我想尝试其他选择。我想在客户端之间使用Sockets进行直接连接(Web服务器只是作为初始会议点),但是如果所有设备都在同一个网络中,那么这种方式只能工作得很好。考虑到今天我们几乎总是在路由器的NAT后面,我该如何实现直接通信?我一直在阅读关于打孔技术的知识,但是我找不到任何有很好文档记录的良好库(包含很好的使用示例),并且确实适用于Android。另外,大多数(如果不是全部的话)冲孔技术(STUN,ICE等)只能用于UDP,这适用于音频/视频和实时多人游戏,可能会丢失一些消息,但对于多人游戏机基于游戏的保证交付每个回合的数据是非常重要的(这是UDP不可能直接实现的)。

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

+0

Win Myo Htet提供的解决方案具有很好的潜力(它使用Google自己的基础架构)。不过,我仍然对Android上的TCP和/或UDP打孔解决方案感兴趣。 – petersaints 2012-04-04 16:34:16

+0

你最终以@petersaints结束了什么? – kishu27 2017-04-26 21:08:15

回答

8

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

+0

我也想过使用XMPP。你使用了什么版本的Smack?看起来,原始项目不是为Android构建的,但有一些端口。 另外,通过XMPP发送数据很简单吗?你只能发送文本或有可能发送二进制数据? – petersaints 2012-04-04 16:11:41

+0

我不使用二进制文件,但我需要进行一些更改。您可以将二进制文件作为两个玩家之间的文件传输发送给MUC。然而,那时候,二进制转换并不那么健壮,因为谷歌已经实现了协议的不同以及实现本身并不十分健壮。好消息是,新的smack版本最近出来了,它已经解决了文件传输,我听说。我还没有检查过这个。 – 2012-04-04 16:24:24

+0

嗯,是的!这可能会起作用。感谢您的提示。你能否告诉你使用的Smack版本是否来自这里(我认为这是官方版本):http://www.igniterealtime.org/downloads/index.jsp#smack如果不是,你使用的是什么Android端口? 我会将邮件标记为稍后接受。因为我仍然对直接的TCP/UDP连接感兴趣,但这是一个很好的解决方法(可能比打孔更简单)。 – petersaints 2012-04-04 16:31:47

0

你几乎被迫使用中介。您可以查看Natblaster的机制,该机制可用于在某些NAT设备之间建立TCP连接,但这并不是您可以在不使用任何设备的情况下使用Android的情况。即便如此,它是实验性的。

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

0

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

作为一个说明,这是可能实现的,但可能会耗费时间,并且成本/收益可能无法解决您的情况。