ConnectException可通过错误信息区分根本原因:“Connection refused”表明服务未监听或防火墙拒绝,属服务端问题;“No route to host”或“Connection timed out”则指向网络链路不通。需结合telnet/nc、ping及ss/netstat命令交叉验证。

ConnectException 本身不能直接告诉你“是服务器宕机”还是“网络链路不通”,但它抛出时附带的**具体错误信息**和**响应行为特征**,配合简单诊断命令,能帮你快速区分这两类根本原因。
看异常提示里的关键词
Java 抛出的 ConnectException 消息通常包含关键线索:
- Connection refused:说明 TCP SYN 包发出去后,对端明确返回了 RST(复位)报文。这基本排除纯网络中断,指向服务未监听(宕机、未启动、bind 错地址)或防火墙主动拒绝。
- No route to host 或 Network is unreachable:操作系统内核在发包前就判定目标 IP 不可达(比如路由表缺失、网关不可达),属于底层网络配置或链路问题,与服务状态无关。
- Connection timed out:SYN 发出后既没收到 SYN-ACK,也没收到 RST,等了几秒超时。这更倾向网络路径中断(中间设备丢包、ACL 静默拦截)、目标主机宕机且未响应 ICMP、或目标机器开机但网络模块异常。
用 telnet 或 nc 快速验证响应类型
不依赖 Java 程序,直接在客户端机器上执行:
-
telnet 192.168.1.100 8080(Linux/macOS/WSL)或Test-NetConnection 192.168.1.100 -Port 8080(PowerShell) - 如果立即返回 “Connection refused” → 服务端有响应,只是拒绝连接 → 大概率服务未运行或未监听该 IP:端口。
- 如果卡住数秒后报 “Could not open connection” 或超时 → 中间无响应 → 网络链路不通、目标主机关机、或防火墙静默丢包。
结合 ping 和端口探测交叉判断
单一 ping 成功 ≠ 端口可达,但组合使用能缩小范围:
-
ping 192.168.1.100成功 +nc -zv 192.168.1.100 8080显示 refused → 服务未启动或监听地址不对(如只绑 127.0.0.1)。 -
ping 192.168.1.100失败 +nc超时 → 目标主机离线、网线拔掉、路由故障或目标禁 ping 且网络层已断。 -
ping失败但nc显示 refused → 极少见,可能目标主机部分网络栈异常(如 ICMP 被禁但 TCP 协议栈仍工作)。
查服务端监听状态确认是否真宕机
登录目标服务器,确认服务进程和端口绑定情况:
- Linux:
ss -tuln | grep :8080—— 若无输出,服务确实没起来或没监听该端口。 - Windows:
netstat -ano | findstr :8080—— 查看是否有 LISTENING 状态及对应 PID,再用tasklist /fi "pid eq XXXX"确认进程名。 - 若发现服务进程存在但
ss无监听记录 → 很可能它只 bind 到 127.0.0.1,对外不可达,不是“宕机”,是配置错误。

















