2

我用 Java 完成了一个在 LAN 范围内完美运行的 P2P 程序,现在我陷入了众所周知的 NAT 穿越问题。我想让我的用户通过 NAT 边界相互连接(我知道不可能 100% 了解它)。我已经阅读了很多关于这个主题的内容,虽然我已经理解了这个概念,但我仍然对 TCP 打孔有疑问。

我想要做的是将两个客户端相互连接(它们生活在同一个NAT下),它们的ip分别是192.168.100.1192.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 *)。

欢迎任何帮助。

4

1 回答 1

2

有不同的方法可以继续。

  1. 您可以实现某种代理。两个客户端都连接到它(在 NAT-Barrier 之外)并让它路由他们的消息。
  2. 如果您想要直接连接 Client2Client,您的用户必须在其 NAT-Barrier 上打开一个端口并将其转发到本地 IP。

这很烦人,但这也是它的工作原理。

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

于 2012-10-05T12:14:06.710 回答