我正在做一个允许用户在线玩的 android 应用程序。
目前,我使用 TCP 服务器:当两个人连接时,服务器负责在两个客户端之间转发数据包。
我想用带有谷歌应用引擎的 java servlet 替换我的服务器。这个新服务器将仅用于连接两个玩家。
它会以这种方式工作: 玩家 A 打开服务器套接字,然后将连接详细信息发布到服务器。 当玩家 B 想与 A 对战时,他向服务器询问 A 的端口号,然后他直接连接到 A。
问题是如果玩家 A 在 NAT 后面,我不确定它是否会起作用。当玩家 A 打开服务器套接字时,这会打开其 192.168.x.y 地址的一个端口,但它是否向盒子请求端口转发?我认为它不会...
所以两个问题: 即使有 NAT 或防火墙,是否可以在两个设备之间建立直接连接 TCP(我不知道防火墙如何在 Android 上工作......) 如果不可能,最好的解决方案是什么:是否可以制作一个 TCP 服务器来确保与应用引擎交换消息?
提前谢谢你。
最佳答案
在不同 NAT 下的用户之间建立直接 TCP 连接是很有可能的。 NAT 有 4 种类型。 FC、ARC、PRC、对称。如果玩家 A 或 B 之一具有对称 NAT,则无法创建 TCP P2P 连接。在这种情况下,您将不得不使用中间的服务器在两个玩家之间交换数据。
对于其他类型的 NAT 组合,这是很有可能的,但不能保证。用于创建 TCP P2P 连接的技术称为 TCP 打洞。阅读此 answer了解有关此技术的详细信息。
同时创建TCP P2P连接与任何平台无关。
关于java - 两个 android 设备之间的 TCP 连接(即使使用 NAT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32316339/