Java TCP孔折叠-如何继续此步骤

Java TCP孔折叠-如何继续此步骤,java,tcp,udp,p2p,udpclient,Java,Tcp,Udp,P2p,Udpclient,我用Java完成了一个P2P程序,该程序在LAN范围内运行得非常好,现在我陷入了众所周知的NAT遍历问题。我希望允许我的用户通过NAT边界相互连接(我知道这是不可能100%了解的)。我已经读了很多关于这个主题的书,虽然我已经理解了这个概念,但我仍然怀疑做TCP孔折叠 我想做的是将两个客户端相互连接(它们生活在同一个NAT下),它们的IP分别是192.168.100.1和192.168.100.2(它们可以直接相互连接)。它们首先通过端口80上的套接字连接到PHP服务器。服务器注册其公共IP和端口

我用Java完成了一个P2P程序,该程序在LAN范围内运行得非常好,现在我陷入了众所周知的NAT遍历问题。我希望允许我的用户通过NAT边界相互连接(我知道这是不可能100%了解的)。我已经读了很多关于这个主题的书,虽然我已经理解了这个概念,但我仍然怀疑做TCP孔折叠

我想做的是将两个客户端相互连接(它们生活在同一个NAT下),它们的IP分别是192.168.100.1和192.168.100.2(它们可以直接相互连接)。它们首先通过端口80上的套接字连接到PHP服务器。服务器注册其公共IP和端口,类似于:

客户端1:200.000.000.1:1478
客户端2:120.000.000.1:2547

每个客户端的Java套接字在连接时返回,例如:

客户端1:Socket[addr=/xx.xx.xx.xx,port=80,localport=54632]
客户端2:Socket[addr=/xx.xx.xx.xx,port=80,localport=41789]

Id est,除了通过端口80与服务器打开的两个tcp连接之外,我还有每个客户端的私有ip、公共ip、本地端口和公共端口。那就是我的问题了。从现在起,我不知道该怎么做。我读到的关于这一步的内容对我来说不是很清楚

是否有必要让两个客户端监听公共端口(1478-2547)或本地端口(54632-41789)?同时让他们试着在公共或私人场合联系对方?我还需要打开多少个插座?我做了一些测试,但我认为有问题(*连接被拒绝*


欢迎任何帮助。

有不同的方法可以继续

  • 您可以实现某种代理。两个客户端都连接到它(NAT屏障之外),并让它路由它们的消息
  • 如果您希望直接连接Client2Client,您的用户必须在其NAT屏障上打开一个端口,并将其转发到本地IP
  • 这很烦人,但这也是它的工作原理

    对于客户机A来说,了解客户机B的本地数据是没有用的,因为他无法访问它。 关于最后几个问题:本地客户端A监听一个端口,比如说X,然后本地客户端B必须连接到客户端A网络的公共IP。可能是路由器。在那里,端口必须配置为转发到本地客户端A。仅此而已。
    如果您遵循可能性#1(见上文),则必须在客户端a和B连接的端口X上侦听公共服务。由于这些将是到公共IP的传出连接,因此不需要HolePunch。

    基本上,您可以使用代理,也可以使用SNAT。无论哪种方式,都必须有人监听才能打开连接。UPnP由一些(许多?大多数?)防火墙支持,可用于应用程序以编程方式请求转发“侦听”端口。很好的补充,谢谢。这基本上是为用户透明地进行路由器的转发配置。