java - 我在socket上设置了超时,发现这个值不能大于21

标签 java sockets connection-timeout

我在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秒后超时。但是如果你把60,000改为5,000,你会发现它实际上在5秒内就结束了。我怀疑套接字的默认超时只有21秒,但我找不到证据。我想找到证据并知道我应该做什么才能让他超过60秒而不是21秒。 这个主机:128.28.28.28是一个不存在的地址。我的问题是为什么我把超时设置为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 。因此,无论您在应用程序代码中设置什么值,操作系统都可能会将其降低到实际允许的最高值。您通过实验看到的大约 21 秒的值可能是操作系统中设置的实际限制,或者更可能的是,该值可能设置为 20 秒,但由于大多数超时不是实时值,而是仅在尽力而为的基础上处理,因此您观察到的实际值可能略高于标称的 20 秒。

关于java - 我在socket上设置了超时,发现这个值不能大于21,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56146261/

相关文章:

javascript - Socket.io - 事件监听器触发两次

索引期间 Solr 连接超时?

sql-server - SSIS 如何管理关闭连接?我可以强制吗?

c# - 套接字流不包含整个响应

java - 使用try-catch跳过异常导致陷入无限循环

java - 按多个属性对对象排序

java - 将byte[]中的加密图像转换为java中的BufferedImage而不解密

java - 如果两个不同步的线程将计数器递增 X 次,总结果会小于 X 吗?

java - 将值从 jsp 发送到 servlet,然后返回到 jsp

php - 使用 Server-Sent 事件广播消息