首页 文章

两个Android设备之间的TCP连接(即使使用NAT)

提问于
浏览
1

我正在做一个Android应用程序,允许用户在线玩 .

目前,我使用TCP服务器:当连接两个人时,服务器负责在两个客户端之间转发数据包 .

我想用谷歌应用程序引擎的java servlet替换我的服务器 . 这个新服务器只用于连接两个玩家 .

它将以这种方式工作:播放器A打开服务器套接字,然后将连接详细信息发布到服务器 . 当玩家B想要对抗A时,他向服务器询问A的端口号并且他直接连接到A.

问题是,如果玩家A在NAT后面,我不确定它是否会起作用 . 当玩家A打开服务器套接字时,会打开其192.168.x.y地址的一个端口,但它是否要求该框转发端口?我认为它不...

所以有两个问题:是否有可能在两个设备之间 Build 直接连接TCP,即使存在NAT或防火墙(我不知道防火墙如何在Android上工作......)如果不可能,那么什么是最佳解决方案:是否可以制作TCP服务器以确保与app引擎交换消息?

提前谢谢你 .

game

2 回答

  • 0

    在不同NAT下的用户之间创建直接TCP连接是最有可能的 . NAT有4种类型 . FC,ARC,PRC,对称 . 如果播放器A或B中的一个具有对称NAT,则不可能创建TCP P2P连接 . 在这种情况下,您将不得不使用中间的服务器在两个玩家之间交换数据 .

    对于其他类型的NAT组合,它是非常可能的,但不能保证 . 用于创建TCP P2P连接的技术称为TCP打孔 . 阅读本answer以了解有关此技术的详细信息 .

    创建TCP P2P连接也与任何平台无关 .

  • 0

    首先,设备本身可能不会成为主要问题 . 如果他们在家并且使用WiFi,您可能必须处理有线调制解调器/ DSL调制解调器,其通常包括防火墙 . 此外,如果他们在工作(或酒店, Session 中心等),可能有企业防火墙处理 .

    我相信大多数家用有线/ DSL调制解调器都支持uPnP(通用即插即用),其中包括互联网网关设备协议(IGD),旨在让设备确定外部IP地址并设置端口映射 . 通常,您可以查找NAT遍历,以了解通过家庭调制解调器/防火墙处理连接的方法 . 我会注意到企业防火墙是另一回事,其中许多技术都行不通 .

    所以我可能会建议您至少准备好以下四种情况

    • 直接连接,没有任何问题 . 您可以通过让服务器在第一次联系服务器时进行测试连接来测试这一点 . 如果这样做,事情很简单 .

    • 了解uPnP的家庭NAT设备 . 如果您有10.xxx,172.16.xx-172.31.xx或192.168.xx号码(典型的家庭WiFi),那么您可以尝试设置NAT遍历,如果可行,您可以将适当的信息发送到您的服务器 . 为了确保一切正常,服务器进行测试连接可能是值得的 .

    • 如果你有防火墙,你可以查看B是否接受连接,如果是,那么安排A连接到B .

    • 如果以上都不起作用,那么A和B都连接到服务器并让服务器在A和B之间中继消息 .

    如果您不想编写所有这些可能性,那么选项4是最有可能工作的选项,即使它确实意味着进出服务器的额外流量 . 但请注意,对于企业网络,他们可能只是有一个阻止未知连接的规则,并且可能没有太多可以做的 .

    编辑:我能够得到一个简单的TCP服务器在Android上工作,没有任何关于Android本身的特殊情况,所以删除了一条评论说我不知道 .

相关问题