我使用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
答案 0 :(得分:12)
什么类型的路由器?不要忘记,即使路由器上的端口可能已打开,您需要将路由器转发端口8084连接到目标计算机的内部IP,否则因为网络地址转换(NAT)路由器/ firewall一旦到达那里就不知道如何处理流量。
例如,您的客户端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转换(还有其他几个,但你明白了)。
您不必调整客户端路由器上的任何设置,因为该路由器已经知道如何将您的请求路由到互联网。
答案 1 :(得分:0)
我询问了netstat,看看你是否正在收听127.0.0.1,但我不熟悉你的操作系统显示的内容。
假设您不小心仍在侦听localhost:对于路由器,您通常必须转发到特定地址。至少,使用我拥有的路由器,这就是我必须要做的。假设你没有监听localhost,那么路由器需要转发到ifconfig显示的IP。