Java Socket公网设备连接超时问题求助
Java公网Socket连接超时问题排查
问题概况
我是学了5个月的Java新手,想通过公网连接两个Socket程序,结果一直报连接超时。朋友能ping通我的公网IP(151.245.38.21),但Java客户端就是连不上。已经按网上说的做了端口转发,还是不行。
客户端代码
import java.io.*; import java.net.*; public class Client{ public static void main(String[] args) throws IOException{ Socket s = new Socket("151.245.38.21",113); while (true){ } } }
服务端代码
import java.io.*; import java.net.*; public class SERVER{ public static void main(String[] args) throws IOException{ ServerSocket ss = new ServerSocket(113); // 端口转发用的就是这个端口 Socket s = ss.accept(); System.out.println("Connected!"); System.out.println(s); System.out.println(ss); while (true){ } } }
错误日志
Exception in thread "main" java.net.ConnectException: Connection timed out: connect at java.base/sun.nio.ch.Net.connect0(Native Method) at java.base/sun.nio.ch.Net.connect(Net.java:579) at java.base/sun.nio.ch.Net.connect(Net.java:568) at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:585) at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327) at java.base/java.net.Socket.connect(Socket.java:633) at java.base/java.net.Socket.connect(Socket.java:583) at java.base/java.net.Socket.<init>(Socket.java:507) at java.base/java.net.Socket.<init>(Socket.java:287) at Client.main(Client.java:7)
排查和解决建议
- 换个端口试试:你用的113是知名端口(对应Ident协议),很多运营商或者系统防火墙会默认限制这类端口。换成1024以上的非知名端口,比如8080、9090,记得同步改服务端的
ServerSocket和客户端的连接端口。 - 核对端口转发规则:
- 确认路由器上的端口转发是把公网端口(和你Java程序用的端口一致)映射到服务端机器的内网IP和对应端口。
- 服务端机器的内网IP最好设成静态的,不然DHCP自动换IP的话,端口转发就白配了。
- 检查服务端防火墙:服务端机器的系统防火墙(Windows防火墙、Linux的iptables等)可能拦截了这个端口的入站请求。要么给这个端口加个放行规则,要么临时关掉防火墙测试一下。
- 先测本地连接:在服务端机器上用客户端连
localhost:113(或者你换后的端口),先确认本地代码没问题,再排查公网的问题。 - 确认公网IP没换:家庭网络的公网IP大多是动态的,可能你配端口转发的时候IP已经变了。重新查一下当前的公网IP,更新客户端代码里的IP地址。
- 测试端口连通性:让朋友用
telnet 151.245.38.21 113(或新端口)试试能不能连上,要是连不上,说明端口转发或者防火墙还是有问题。
内容的提问来源于stack exchange,提问作者MASEH
相关产品推荐
相关产品推荐

