Java, увеличьте время ожидания сокета - PullRequest
11 голосов
/ 31 октября 2011

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

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

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

РЕДАКТИРОВАТЬ: Как я понимаю сейчас, это то, что сокет соединение не открывается на стороне клиента. Он передается с сервера. Таким образом, я декомпилировал также файл JAR сервера. Но все еще не могу найти что-либо о тайм-ауте.

Ответы [ 4 ]

10 голосов
/ 31 октября 2011

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

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

8 голосов
/ 31 октября 2011

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

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

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

0 голосов
/ 31 октября 2011

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

0 голосов
/ 31 октября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...