在java上的nat后面打开套接字

Posted

技术标签:

【中文标题】在java上的nat后面打开套接字【英文标题】:Open socket behind nat on java 【发布时间】:2018-07-12 23:32:15 【问题描述】:

我在 NAT 后面的 android 设备上有一个服务器套接字,我想从另一个设备连接到这个套接字。我知道,我如何通过打孔来实现这一点,但我有一些问题。它适用于我的移动运营商,但我与其他运营商有问题。普遍的问题是不同的移动运营商有不同的 NAT 类型。有人有同样的问题吗?有哪些解决方案?

【问题讨论】:

一些移动运营商不仅使用 NAT,而且还设置了防火墙来阻止设备之间的所有流量。因此,可靠的设备到设备通信需要两个设备都连接到互联网上的服务器或设备之间的直接网络(蓝牙、Wifi 直连……)。 你不能。这就是为什么 NAT 是邪恶的,为什么 IPv6 是惊人的。另请参阅serverfault.com/questions/894488/… 当我使用打孔时,仅在我的国家的一家移动运营商中,它运行良好。 你能补充一些关于你是如何实现整体打孔的细节吗? 但那是真的。并非所有 nats 类型都支持打孔,因为它们不是标准化的。 en.wikipedia.org/wiki/TCP_hole_punching 另外,其他客户端设备也很重要。就像 NATS 和防火墙通常是 MODEM/ROUTER 问题(而不是 ISP)一样,我认为可能是另一部有问题的手机而不是他们的移动运营商。让 P2P 连接正常工作总是很困难,请确保这是最适合您的解决方案。 【参考方案1】:

在实现“推送到移动”功能时,我们都会遇到此类问题。 试图绕过防火墙/nat 是浪费时间,这个解决方案(如您所见)非常依赖于运营商。

常见的解决方案是使用“假”推送解决方案,如长套接字轮询。

为了简单起见,我推荐使用 Jetty 的“websocket”。 它提供了一种获得常规套接字“相似”功能而没有缺点的方法。

【讨论】:

以上是关于在java上的nat后面打开套接字的主要内容,如果未能解决你的问题,请参考以下文章

Internet 上的 Java 套接字:ConnectException(操作超时)

用于 UDP NAT 打孔的 PHP 和 Java...?

在 OpenShift Python 主机上的端口上打开一个套接字

如何立即终止套接字 IO 操作上的线程阻塞?

路由器等NAT设备中TIME_WAIT套接字分析

UDP打孔到期[关闭]