如何让Java套接字使用公共IP?

我没有遇到使用localips的套接字没有问题,但是一旦我将代码更改为使用public ips,我就一直得到java.net.ConnectException。

我使用端口8084,据我所知,在其他地方没有使用在命令提示符下,netstat -a | grep 8084显示:文件STDIN:TCP user-9114eb19a8:8084 user-9114eb19a8:0 LISTENING

我已经进入我的路由器并确保它是开放的我使用请求http://www.whatismyip.org获取我的公共IP

服务器:

serverSocket = new ServerSocket (8084); 

客户:

 socket = new Socket (hostaddr, 8084); //hostaddr is a string containing my public-IP //it works when the program is run on a localnetwork and I am using my local-ips 

什么类型的路由器? 不要忘记,即使您的路由器上的端口可能已打开,您需要将路由器转发端口8084到目标计算机的内部IP,否则由于网络地址转换(NAT),路由器/防火墙不知道是什么一旦到达那里,就要处理流量。

例如,您的客户端PC位于加利福尼亚州,IP为10.1.1.100,路由器使用公共IP为70.62.50.42。

您的服务器PC位于纽约,IP为192.168.1.121,位于内部IP为192.168.1.1且公共IP为40.20.26.63的路由器后面。 您需要确保进入路由器并将端口8084(TCP)转发到内部地址192.168.1.121(内部服务器PC)。

根据路由器的级别,这个术语将是端口转发,虚拟IP或静态NAT转换(还有一些其他但你明白了)。

您不必调整客户端路由器上的任何设置,因为该路由器已经知道如何将您的请求路由到Internet。

我询问netstat只是为了看看你是否正在收听127.0.0.1,但我不熟悉你的操作系统显示的内容。

假设您不小心仍在侦听localhost:对于路由器,您通常必须转发到特定地址。 至少,使用我拥有的路由器,这就是我必须要做的。 假设您没有监听localhost,那么路由器需要转发到ifconfig显示的IP。