【问题标题】:TCP connection between two android devices (even with NAT)两个 android 设备之间的 TCP 连接(即使使用 NAT)
【发布时间】:2015-08-31 17:04:41
【问题描述】:

我正在做一个允许用户在线玩的安卓应用。

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

我想用带有谷歌应用引擎的 java servlet 替换我的服务器。这个新服务器将仅用于连接两个玩家。

它会以这种方式工作: 玩家 A 打开一个服务器套接字,然后将连接详细信息发布到服务器。 当玩家 B 想与 A 对战时,他向服务器询问 A 的端口号,然后直接连接到 A。

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

所以有两个问题: 即使有NAT或防火墙,是否可以在两台设备之间建立直接连接TCP(我不知道防火墙如何在Android上工作......) 如果不可能,最好的解决方案是什么:是否可以做一个TCP服务器来确保与应用引擎的消息交换?

提前谢谢你。

game

【问题讨论】:

  • '玩家 A 打开一个服务器套接字,然后将连接详细信息发布到服务器。'。抱歉,我什至无法理解您场景的第一句话。
  • 这个项目 (github.com/kaklakariada/portmapper) 有 UPnP 端口映射 Java 代码,它在 J2SE 中工作,但不了解 Android。我已经尝试过了,并且在我的 Thomson vdsl2 路由器上工作得很好。我在 Java-gaming.org 网站 (java-gaming.org/index.php?topic=22088.0) 中找到了该项目的链接

标签: java android tcp serversocket nat


【解决方案1】:

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

对于其他类型的 NAT 组合,这是很有可能的,但不能保证。用于创建 TCP P2P 连接的技术称为 TCP 打孔。阅读此answer 以详细了解此技术。

同样创建 TCP P2P 连接与任何平台无关。

【讨论】:

    【解决方案2】:

    首先,设备本身可能不会成为主要问题。如果他们在家并使用 WiFi,您可能必须使用电缆调制解调器/DSL 调制解调器,这通常包括防火墙。此外,如果他们在工作(或酒店、会议中心等),可能需要处理公司防火墙。

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

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

    1. 直接连接没有任何问题。您可以通过在玩家第一次联系服务器时让服务器进行测试连接来测试这一点。如果这行得通,事情就很简单了。
    2. 理解 uPnP 的家庭 NAT 设备。如果您有 10.xxx、172.16.xx-172.31.xx 或 192.168.xx 号码(典型的家庭 WiFi),那么您可以尝试设置 NAT 遍历,如果可行,您可以将适当的信息发送到您的服务器.为了确保一切正常,服务器进行测试连接可能是值得的。
    3. 如果你有无法绕过的防火墙,则在服务器上记录玩家 A,当 B 尝试加入 A 的游戏时,查看 B 是否接受连接,如果是,则安排让 A 连接到 B。
    4. 如果以上都不起作用,则让 A 和 B 都连接到服务器,并让服务器在 A 和 B 之间中继消息。

    如果您不想对所有这些可能性进行编程,那么选项 4 是最有可能起作用的选项,即使它确实意味着进出您的服务器的额外流量。但请注意,对于企业网络,它们可能只是有一条规则阻止未知连接,您可能无能为力。

    编辑:我能够让一个简单的 TCP 服务器在 Android 上运行,而没有任何关于 Android 本身的特殊内容,因此删除了一条说我不知道​​的评论。

    【讨论】:

      猜你喜欢
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-13
      • 2012-01-16
      • 2012-10-21
      • 2012-12-06
      • 1970-01-01
      相关资源
      最近更新 更多