我在socket上设置了timeout,发现这个值不能大于21

I set the timeout on the socket, and I found that this value cannot be greater than 21

我在socket上设置了超时,小于21秒有效,21秒后发现超时还是21秒

public static void main(String[] args) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    String time1= sdf.format(new Date());
    System.out.println(time1);
    try {
        Socket sock = new Socket();
        SocketAddress socketAddress = new InetSocketAddress("128.28.28.28",80);
        sock.connect(socketAddress,60000);
    }catch (Exception ex){
        ex.printStackTrace();
    }finally {
        time1= sdf.format(new Date());
        System.out.println(time1);
    }
}

运行 这段代码应该需要 60 秒才能超时,但它会在大约 21 秒后超时 seconds.But 如果您将 60,000 更改为 5,000,您会发现它实际上已经结束了五 seconds.I 怀疑套接字的默认超时只有 21 秒,但我找不到 evidence.I 想找到证据并知道我应该怎么做才能让他超过 60 秒而不是 21 秒。 this host: 128.28.28.28 is a non-existent address.My 问题是为什么我将超时设置为 60 秒,但它在 21 秒内超时。

错误:

java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at             

com.dongbawen.hppa.biz.rulemstrecipe.Send_Class.main(Send_Class.java:49)

套接字调用在最低级别由您的操作系统处理 (OS),这可能会对超时等参数的允许值施加限制。参见示例:Overriding the default Linux kernel 20-second TCP socket connect timeout。因此,无论您在应用程序代码中设置什么值,OS 都可能会将其降低到它实际允许的最高值。您通过实验看到的大约 21 秒的值可能是您 OS 中设置的实际限制,或者更可能的是,该值可能设置为 20 秒,但由于大多数超时不是 real-time 值但仅在 best-effort 基础上处理,您观察到的实际值可能略高于标称的 20 秒。