Я установил тайм-аут на сокете и обнаружил, что это значение не может быть больше 21.

Я устанавливаю тайм-аут на сокете, который действителен, если значение меньше 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, вы увидите, что на самом деле он заканчивается через пять секунд. Я подозреваю, что тайм-аут сокета по умолчанию составляет всего 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)


person John Ziv    schedule 15.05.2019    source источник


Ответы (1)


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

person Michał Kosmulski    schedule 15.05.2019
comment
Я следовал методу по ссылке выше, но все было по-прежнему. Сначала я подозревал, что это из-за того, что сервер не перезагружался, но потом я перезапустил, но все было по-прежнему. Я очень расстроен. этот вопрос меня давно мучает - person John Ziv; 15.05.2019
comment
Я очень охотно верю этому методу, потому что он кажется полезным методом, который у меня есть до сих пор, но он все еще не работает после того, как я попробовал его. Что я должен делать - person John Ziv; 15.05.2019
comment
О, кажется, я нашел причину. До этого я тестировал виртуальную машину Linux на Windows. Я обнаружил, что независимо от того, как я устанавливал его так, как вы мне дали, тайм-аут по-прежнему составлял 20 с. Пока я не протестировал настоящий сервер Linux, я обнаружил, что могу установить тайм-аут по желанию. - person John Ziv; 16.05.2019
comment
Итак, как мне увеличить это значение в системе Windows? - person John Ziv; 16.05.2019