两个 android 设备之间的 TCP 连接(即使使用 NAT)
TCP connection between two android devices (even with NAT)
我正在做一个 android 允许用户在线玩的应用程序。
目前,我使用的是 TCP 服务器:当两个人连接时,服务器负责转发两个客户端之间的数据包。
我想用 java 带有 google 应用程序引擎的 servlet 替换我的服务器。这个新服务器将只是用来连接两个玩家。
它会以这种方式工作:
玩家 A 打开服务器套接字,然后 post 向服务器发送连接详细信息。
当玩家 B 想和 A 对战时,他向服务器询问 A 的端口号,然后他直接连接到 A。
问题是如果播放器 A 在 NAT 后面,我不确定它是否有效。当玩家 A 打开服务器套接字时,这会打开其 192.168.x.y 地址的一个端口,但它是否向盒子请求端口转发?我认为它不会...
所以两个问题:
即使有 NAT 或防火墙,是否可以在两个设备之间建立直接连接 TCP(我不知道防火墙如何在 Android 上工作...)
如果不可能,最好的解决方案是什么:是否可以制作一个 TCP 服务器以确保与应用引擎交换消息?
提前致谢。
首先,设备本身可能不是主要问题。如果他们在家并使用 WiFi,您可能需要使用有线 modem/DSL 调制解调器,它通常包含防火墙。另外如果他们在工作(或酒店、会议中心等),可能会有企业防火墙需要处理。
我相信大多数家庭 cable/DSL 调制解调器都支持 uPnP(通用即插即用),其中包括互联网网关设备协议 (IGD),旨在让设备确定外部 IP 地址并设置端口映射。通常,您可以查找 NAT 遍历以了解处理通过家庭 modem/firewall 的连接的方法。我会注意到公司防火墙是另一回事,其中许多技术都行不通。
所以我可能会建议您至少为以下四种情况做好准备
- 直接连接,不会产生任何问题。您可以通过让服务器在播放器首次联系服务器时进行测试连接来对此进行测试。如果这行得通,事情就简单了。
- 支持 uPnP 的家庭 NAT 设备。如果你有10.x.x.x、172.16.x.x-172.31.x.x或192.168.x.x号码(典型的家庭WiFi),那么你可以尝试设置NAT遍历,如果可行,您可以将适当的信息发送到您的服务器。服务器进行测试连接以确保一切正常可能是值得的。
- 如果你有无法绕过的防火墙,那么在服务器上记录玩家 A,当 B 尝试加入 A 的游戏时,查看 B 是否会接受连接,如果是的话然后安排A连接到B。
- 如果上述none有效,则让A和B都连接到服务器并让服务器在A和B之间中继消息。
如果您不想对所有这些可能性进行编程,那么选项 4 是最有可能起作用的选项,即使它确实意味着 to/from 您的服务器需要额外的流量。但请注意,对于企业网络,他们可能只是有一个规则来阻止未知连接,而你能做的可能不多。
编辑:我能够在 Android 上获得一个简单的 TCP 服务器,而 Android 本身没有任何特殊之处,因此删除了一条评论说我不知道。
在不同 NAT 下的用户之间建立直接 TCP 连接几乎是可能的。 NAT 有 4 种类型。 FC、ARC、PRC、对称。如果玩家 A 或 B 之一具有对称 NAT,则无法创建 TCP P2P 连接。在这种情况下,您将不得不使用中间的服务器在两个玩家之间交换数据。
对于其他类型的 NAT 组合,这是很有可能的,但不能保证。用于创建 TCP P2P 连接的技术称为 TCP 打洞。阅读此 以详细了解此技术。
同时创建TCP P2P连接与任何平台无关
我正在做一个 android 允许用户在线玩的应用程序。
目前,我使用的是 TCP 服务器:当两个人连接时,服务器负责转发两个客户端之间的数据包。
我想用 java 带有 google 应用程序引擎的 servlet 替换我的服务器。这个新服务器将只是用来连接两个玩家。
它会以这种方式工作: 玩家 A 打开服务器套接字,然后 post 向服务器发送连接详细信息。 当玩家 B 想和 A 对战时,他向服务器询问 A 的端口号,然后他直接连接到 A。
问题是如果播放器 A 在 NAT 后面,我不确定它是否有效。当玩家 A 打开服务器套接字时,这会打开其 192.168.x.y 地址的一个端口,但它是否向盒子请求端口转发?我认为它不会...
所以两个问题: 即使有 NAT 或防火墙,是否可以在两个设备之间建立直接连接 TCP(我不知道防火墙如何在 Android 上工作...) 如果不可能,最好的解决方案是什么:是否可以制作一个 TCP 服务器以确保与应用引擎交换消息?
提前致谢。
首先,设备本身可能不是主要问题。如果他们在家并使用 WiFi,您可能需要使用有线 modem/DSL 调制解调器,它通常包含防火墙。另外如果他们在工作(或酒店、会议中心等),可能会有企业防火墙需要处理。
我相信大多数家庭 cable/DSL 调制解调器都支持 uPnP(通用即插即用),其中包括互联网网关设备协议 (IGD),旨在让设备确定外部 IP 地址并设置端口映射。通常,您可以查找 NAT 遍历以了解处理通过家庭 modem/firewall 的连接的方法。我会注意到公司防火墙是另一回事,其中许多技术都行不通。
所以我可能会建议您至少为以下四种情况做好准备
- 直接连接,不会产生任何问题。您可以通过让服务器在播放器首次联系服务器时进行测试连接来对此进行测试。如果这行得通,事情就简单了。
- 支持 uPnP 的家庭 NAT 设备。如果你有10.x.x.x、172.16.x.x-172.31.x.x或192.168.x.x号码(典型的家庭WiFi),那么你可以尝试设置NAT遍历,如果可行,您可以将适当的信息发送到您的服务器。服务器进行测试连接以确保一切正常可能是值得的。
- 如果你有无法绕过的防火墙,那么在服务器上记录玩家 A,当 B 尝试加入 A 的游戏时,查看 B 是否会接受连接,如果是的话然后安排A连接到B。
- 如果上述none有效,则让A和B都连接到服务器并让服务器在A和B之间中继消息。
如果您不想对所有这些可能性进行编程,那么选项 4 是最有可能起作用的选项,即使它确实意味着 to/from 您的服务器需要额外的流量。但请注意,对于企业网络,他们可能只是有一个规则来阻止未知连接,而你能做的可能不多。
编辑:我能够在 Android 上获得一个简单的 TCP 服务器,而 Android 本身没有任何特殊之处,因此删除了一条评论说我不知道。
在不同 NAT 下的用户之间建立直接 TCP 连接几乎是可能的。 NAT 有 4 种类型。 FC、ARC、PRC、对称。如果玩家 A 或 B 之一具有对称 NAT,则无法创建 TCP P2P 连接。在这种情况下,您将不得不使用中间的服务器在两个玩家之间交换数据。
对于其他类型的 NAT 组合,这是很有可能的,但不能保证。用于创建 TCP P2P 连接的技术称为 TCP 打洞。阅读此
同时创建TCP P2P连接与任何平台无关