gpt4 book ai didi

java - TCP 打洞 - 如何进行这一步

转载 作者:可可西里 更新时间:2023-11-01 02:41:33 26 4
gpt4 key购买 nike

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

我想做的是将两个客户端相互连接(他们住在同一个 NAT 下),ip 分别是 192.168.100.1192.168.100.2 (它们可以直接相互连接)。他们首先通过端口 80 上的套接字连接到 PHP 服务器。服务器注册其公共(public) ips 和端口,类似这样:

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

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

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

Id est,除了两个通过端口 80 与服务器打开的 tcp 连接之外,我还有每个客户端的私有(private) ip、公共(public) ip、本地端口和公共(public)端口。那么,那是我的问题。从现在开始,我不知道如何进行。我读到的关于这一步的内容不是很清楚。

是否需要让两个客户端监听公共(public)端口 (1478-2547) 或本地端口 (54632-41789)?同时让他们尝试连接对方的公共(public)或私有(private)?我需要打开多少个其他套接字?我已经做了一些测试,但我认为出了点问题(*连接被拒绝*)。

欢迎任何帮助。

最佳答案

有不同的方法可以继续。

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

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

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

关于java - TCP 打洞 - 如何进行这一步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12745941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com