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

标签 java android tcp serversocket nat

我正在做一个允许用户在线玩的 android 应用程序。

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

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

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

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

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

提前谢谢你。

game

最佳答案

在不同 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/

相关文章:

安卓 : Set the date and get day of week

android - 如何在 RecyclerView 中使用 LoadMore?

java - 同一端口上的多个 TCP 服务器

C# NetworkStream - 在读取时区分关闭的套接字和 0 字节数组

java - invokeAll 的参数(集合)是否取决于队列大小?

java - GlassFish 禁止 403 错误页面

Android用动画交换两个图像

c# - 与 C# 服务器的 Android TCP 通信 -> socket.Close

java - 在 JButtons 上绘制焦点

java - 将字符串转换为整数(对象)数组 Java