我可以毫不费力地使套接字与localips一起使用,但是一旦我更改了代码以使用公共ips,我就始终获得java.net.ConnectException。
我正在使用端口8084,据我所知,该端口未在其他地方使用在命令提示符中,netstat -a | grep 8084显示:文件STDIN:TCP用户9114eb19a8:8084用户9114eb19a8:0侦听
我进入路由器并确保它是开放的,我使用对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。