You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Java Socket连接不存在的10.39.188.101主机未抛异常?

Java Socket连接不存在的主机未抛出异常的原因排查

我正尝试理解为何执行socket.connect(new InetSocketAddress(tool.getHost(), tool.getPortTool()), timeout);时,连接不存在的主机未抛出异常,具体情况如下:

测试代码

Main类代码

package esempioSocket;

import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;

import esempioSocket.Tool;

public class Main {

    public static void main(String[] args) throws IOException {

        Tool tool = new Tool("10.39.188.101", 6653);

        System.out.println("reachele 1: " + tool.isReachable() );
        
        int timeout = 1500;

        Socket socket = new Socket();
        System.out.println("after new: " + socket);

        try {
            socket.connect(new InetSocketAddress(tool.getHost(), tool.getPortTool()), timeout);
            System.out.println("after connect: " + socket);
        } catch (UnknownHostException e) {
            System.out.println("run() - UnknownHostException - tool: " + tool.getHost() + ":" + tool.getPortTool());
        } catch (IOException e) {
            System.out.println("run() - IOException - tool: " + tool.getHost() + ":" + tool.getPortTool());
        }

        if (socket.isConnected()) {
            System.out.println("after isConnect: " + socket);
            tool.setReachable(true);
            try {
                socket.close();
                System.out.println("after close: " + socket);
            } catch (IOException e) {
                System.out.println("run() - socket close() " + e);
            }
        } else {
            tool.setReachable(false);
        }
        
        System.out.println("reachele: " + tool.isReachable() );
        System.out.println("last line: " + socket);
        
        
    }
}   

Tool类代码

public class Tool {

    private String host;
    private Integer portTool;
    private boolean reachable;

    
    Tool(String h, Integer port) {
        this.host=h;
        this.portTool=port;
    }

    // 省略setter和getter方法
}

测试情况

  • 用ping、telnet、tracert命令测试10.39.188.101均无响应,执行netstat -an | find "10.39.188.101"和netstat -an | find "6653"也无结果;
  • 运行程序后,连接10.39.188.101:6653未抛出异常,反而输出Socket已连接,标记主机可达;
  • 将主机改为11.39.188.101时,程序正常抛出IOException,标记主机不可达;
  • 在其他电脑(含同版本Java环境)运行该程序,均正常抛出异常,仅当前电脑出现此异常现象。

可能的原因及排查方向

  1. 本地ARP缓存或路由表异常:10.39.188.101这个IP可能在当前机器的ARP缓存中有无效映射,或者路由表中存在指向该IP的特殊条目,导致系统误判该IP可达。可以执行arp -a查看ARP缓存,route print检查路由表,尝试清理缓存后重新测试。
  2. 系统网络拦截工具的特殊规则:本地防火墙、VPN、网络安全软件可能对10.39.188.0/24这类内网IP段设置了特殊规则,拦截连接请求并返回虚假的连接成功信号,而对11段IP没有该规则。可以临时关闭这类工具后重试。
  3. Java Socket连接状态判断的局限性:socket.isConnected()仅表示Socket曾经成功发起过连接,并非实时验证连接有效性。即使系统层面没有抛出异常,实际连接可能并未建立。可以在connect后尝试通过输入输出流发送测试数据,或者结合socket.isClosed()、socket.isInputShutdown()等方法综合判断连接状态。
  4. 本地网卡或网络配置冲突:当前机器若有多块网卡,其中某块网卡的子网包含10.39.188.0段,系统优先通过该网卡发送请求,但实际该子网内无目标主机,且Java设置的超时被系统层面的配置覆盖,导致未触发超时异常。可以尝试禁用多余网卡后测试。

内容的提问来源于stack exchange,提问作者fraaanz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 09:15:24