Подтвердить что ты не робот

Java, увеличить тайм-аут сокета

У меня есть простое клиентское приложение сервера. Все работает, но на каком-то этапе требуется больше 5 минут, чтобы получить ответ от сервера (что нормально, и это должно быть так). Проблема в том, что если это занимает более 5 минут, я получаю это исключение: java.net.SocketTimeoutException: Read timed out.

Итак, мне было интересно, есть ли тайм-аут сокета по умолчанию в Windows или на виртуальной машине Java, которую я мог бы установить? Я не могу изменить код клиента, поэтому setSoTimeout() для меня не вариант.

Использование Windows XP..

EDIT: Как я понимаю, теперь соединение сокетов не открывается на стороне клиента. Его передали с сервера. Таким образом, я декомпилировал также файл jar сервера. Но все же не могу найти ничего о тайм-ауте.

4b9b3361

Ответ 1

Тайм-аут сокета по умолчанию равен 0, что означает отсутствие таймаута. Если это действительно тайм-аут через 5 минут, это означает, что он был установлен в коде. Если источник недоступен, и нет конфигурации, вы можете попробовать декомпилировать класс и искать вызовы setSoTimeout.

Поскольку комментарии и тот факт, что поисковые запросы не нашли вызовов setSoTimeout(), вы можете использовать другой подход. Просто позвольте этому тайм-ауту и ​​напишите небольшой script, который повторит вызов, если он это сделает. Если вы можете вызвать своего клиента из командной строки, вы можете проанализировать вывод, если он идет на stderr.

Ответ 2

Сохранение неиспользуемого TCP-соединения в течение длительного времени без какого-либо трафика не является тривиальным. Многие брандмауэры/маршрутизаторы закрывают неиспользуемые порты после некоторого таймаута.

Один из вариантов может заключаться в том, чтобы реализовать простой протокол keepalive для отправки фиктивных пакетов время от времени, но если вы не можете коснуться кода клиента, это, вероятно, не вариант.

Изменить: я не знаю, как переопределить setSoTimeout(), заданный в клиентском коде.

Ответ 3

Обратите внимание, что значение 0 по умолчанию не соответствует действительности. Так как, например, клиент Axis2 имеет тайм-аут 60 секунд по умолчанию, поэтому он будет зависеть от того, какую реализацию вы используете для совершения вызова.

Можете ли вы предоставить более подробную информацию? Извините за запись в разделе ответов, но у меня недостаточно репутации для комментариев:)

Ответ 4

И вам нужно поддерживать связь живым? Почему бы вам не переосмыслить его, чтобы сделать его более асинхронным. Эта схема не масштабируется вообще. В какой-то момент все ваши доступные потоки могут ждать долгое время от сервера.