Java 通过TCP和公共IP连接,无需转发

Java 通过TCP和公共IP连接,无需转发,java,tcp,ip,public,forwarding,Java,Tcp,Ip,Public,Forwarding,我正试图用java中的TCP编写一个简单的聊天程序 要连接到服务器,我需要知道它的IP地址。我连接到网络中的路由器,它将我连接到互联网 当我输入本地IP(由路由器分配)时,它在我的两台计算机之间工作得很好。 但当我输入公共IP时(我从谷歌那里得到:“什么是你的IP”…),它不起作用 所以我打开了路由器的设置,并制定了从我的公共IP和特定端口到本地IP的转发规则,并且成功了 ---------问题: 但是如何在不转发的情况下做到这一点呢?我想写一个聊天程序。我不能告诉我的用户:“只做端口转发”;)

我正试图用java中的TCP编写一个简单的聊天程序

要连接到服务器,我需要知道它的IP地址。我连接到网络中的路由器,它将我连接到互联网

当我输入本地IP(由路由器分配)时,它在我的两台计算机之间工作得很好。 但当我输入公共IP时(我从谷歌那里得到:“什么是你的IP”…),它不起作用

所以我打开了路由器的设置,并制定了从我的公共IP和特定端口到本地IP的转发规则,并且成功了

---------问题:
但是如何在不转发的情况下做到这一点呢?我想写一个聊天程序。我不能告诉我的用户:“只做端口转发”;)
一个打开我的程序并登录到中央服务器,然后在那个里写入公共IP。其他一些用户打开此服务器,下载文件并获取第一个用户的IP(或任何其他需要的信息)。

但如果第一个用户没有进行端口转发,它将无法工作。如何使其工作?


为此,您需要了解NAT(网络地址转换)的工作原理。简单来说,NAT负责将数据包从外部发送到内部网络上的正确计算机

例如,假设您在内部网络上将计算机A作为服务器,在外部网络上将计算机B作为服务器。如果您随后尝试从计算机B连接到计算机A,它将无法工作,因为NAT(您的路由器)不知道在内部网络上将数据包发送到哪台计算机

当您想要连接到外部服务器时,它是不同的。假设计算机A(客户端)在外部网络上,计算机B(服务器)在内部网络上,路由器端口转发到其IP地址。然后,您将能够连接到服务器,因为NAT知道将数据包发送到哪里。

因此,为了防止所有用户通过端口转发其路由器:

  • 在内部网络上对服务器进行端口转发
  • 连接另一个网络上的客户端
  • 用于内部网络上的客户端;使用服务器的本地IP
希望这有帮助

-Kad

你不能。公共IP地址是路由器的IP地址。服务器未在路由器中运行。没有端口转发,它就无法工作。这就是端口转发的目的。那么其他协议呢,然后是TCP。比如说FTP。我连接到一个服务器并将一个文件下载到我的电脑上,而该服务器不知怎么地知道我的本地IP(或者某种方式知道),所以该文件进入了我的电脑。怎么做到的?你的问题有点不清楚。我花了一段时间才弄明白你不希望你的用户将他们的路由器转发到端口!谢谢,但这不完全是解决办法。我不能端口转发服务器或客户端-因为TCP服务器和客户端都是一些想要聊天的用户-我无法访问他们的路由器。你能给我解释一下吗?假设我想和我的朋友本聊天。My PC->ROUTER 1->Internet有一种方法可以不进行任何端口转发,但包括用户使用VPN隧道连接到本地网络。为此,请查找一个名为Hamachi的程序,因为它使用起来最简单

对于您的另一个问题:您的好友路由器会记住它发送信息的位置和来源。假设你的朋友连接到你的服务器。然后你的朋友路由器知道它已经向那个服务器发送了一些数据包,当它收到响应时,它会查看它并确定它来自你的朋友计算机。谢谢。我决定在中央服务器上使用mysql,并在Java中使用它,因此用户无需做任何事情;)