我用 Java 完成了一个在 LAN 范围内完美运行的 P2P 程序,现在我陷入了众所周知的 NAT 穿越问题。我想让我的用户通过 NAT 边界相互连接(我知道不可能 100% 了解它)。我已经阅读了很多关于这个主题的内容,虽然我已经理解了这个概念,但我仍然对 TCP 打孔有疑问。
我想要做的是将两个客户端相互连接(它们生活在同一个NAT下),它们的ip分别是192.168.100.1和192.168.100.2(它们可以直接相互连接)。他们首先通过端口 80 上的套接字连接到 PHP 服务器。服务器注册其公共 ips 和端口,如下所示:
客户端 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)?同时让他们尝试在对方的公共或私人上进行连接?我需要打开多少个其他套接字?我做了一些测试,但我认为有问题(* connection denied *)。
欢迎任何帮助。