Я установил таймаут для сокета и обнаружил, что это значение не может быть больше 21 - PullRequest
1 голос
/ 15 мая 2019

Я установил таймаут для сокета, который действителен, если значение меньше 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 на 5000, вы увидите, что на самом деле оно истекло через пять секунд. Я подозреваю, что время ожидания сокета по умолчанию составляет всего 21 секунду, ноЯ не могу найти доказательства. Я хочу найти доказательства и знать, что я должен сделать, чтобы заставить его пройти 60 секунд вместо 21. этот хост: 128.28.28.28 - это несуществующий адрес. Мой вопрос, почему я установилТайм-аут до 60 sconds, но он был превышен через 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)

1 Ответ

0 голосов
/ 15 мая 2019

На самом низком уровне вызов сокета обрабатывается вашей операционной системой (ОС), что может накладывать ограничения на допустимые значения параметров, таких как тайм-ауты.См. Например: Переопределение стандартного 20-секундного тайм-аута подключения к сокету TCP для ядра Linux .Таким образом, независимо от того, какое значение вы установили в коде приложения, ОС может понизить его до максимально допустимого значения.Значение около 21 секунды, которое вы видите экспериментально, может быть фактическим пределом, установленным в вашей ОС, или, более вероятно, значение может быть установлено равным 20 секундам, но, поскольку большинство тайм-аутов не являются значениями в реальном времени, а обрабатываются только по наилучшимв зависимости от усилия, фактическое значение, которое вы наблюдаете, может быть немного выше номинального 20 секунд.

...