我正在开始一个小项目,基本上是经典的战舰游戏的多人版(即超过两个玩家)。
在我开始编码之前,我试图解决的一个问题是多个玩家之间的通信问题。当前的可能性是使用中央HTTP服务器作为通信的中心枢纽(再加上Android C2DM API,以允许从HTTP服务器向设备推送通信)。这似乎是一种不错的解决方案,因为理论上只要您可以访问互联网,它就应该完美工作,无论您是否在NAT后面。
但是,所提出的解决方案的缺点是存在单点故障/额外负载(Web服务器)。因此,我想尝试其他选项。我考虑使用套接字直接连接客户端(Web服务器仅用作初始会议点),但是如果所有设备都在同一网络中,则这仅适用于良好的运行。考虑到今天我们几乎总是在路由器的NAT后面,如何实现直接通信?我一直在阅读关于“打洞”的文章,但我找不到任何良好记录(包含良好使用示例)并且肯定适用于Android的库。此外,大多数(如果不是全部)广泛可用的打洞技术(STUN,ICE等)仅适用于UDP,这对于可以丢失一些消息的音频/视频和实时多人游戏来说还不错,但是对于一个多人轮流进行的游戏,重要的是保证每轮数据的传递(这是直接使用UDP不可能实现的)。
那么,有什么方法可以在NAT后面的Android设备之间实现可靠的打洞(最好是通过TCP)?它不必在100%的情况下工作(某些奇怪的NAT可能不受支持),但如果它在大多数情况下都能工作,那就太好了。