ConnectionTimeout против SocketTimeout

135

У меня проблема с библиотекой, которую я использую. Это может быть библиотека или я неправильно ее использую!

Обычно, когда я это делаю (Тайм-аут в миллисекундах)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Исключение тайм-аута не создается, и он работает нормально, однако, когда я делаю следующее,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Я получаю исключение сокета.

Итак, мой вопрос: почему я не могу имитировать исключение подключения? Я неправильно понимаю разницу между сокетом и тайм-аутом соединения? Библиотека здесь (официально еще не выпущена).

Роберт
источник

Ответы:

227

Тайм - аут соединения происходит только при запуске соединения TCP. Обычно это происходит, если удаленная машина не отвечает. Это означает, что сервер был выключен, вы использовали неправильное IP / DNS-имя, неправильный порт или сетевое соединение с сервером прервано.

Тайм - аут сокета предназначен для мониторинга непрерывного входящего потока данных. Если поток данных прерывается на указанное время ожидания, соединение считается заблокированным / разорванным. Конечно, это работает только с соединениями, в которых данные принимаются постоянно.

Установив тайм-аут сокета равным 1, это потребует, чтобы каждую миллисекунду получали новые данные (при условии, что вы читаете блок данных мудро, и блок достаточно велик)!

Если только входящий поток останавливается более чем на миллисекунду, у вас истекает таймаут.

Роберт
источник
1
Могли бы вы когда-нибудь получить тайм-аут соединения, если сервер не выключен, но слишком занят? Или это будет тайм-аут сокета?
Роберт
9
Это зависит - если TCP-соединение было установлено до того, как сервер будет перегружен, вы получите исключение сокета - в противном случае вы получите исключение подключения, указывающее, что TCP-соединение не может быть установлено.
Роберт
2
Учитывая высокую задержку, особенно в старых мобильных сетях, таймаут соединения должен быть установлен на несколько секунд (например, 10 с или лучше 10000 мс). Тайм-аут сокета я бы установил только в том случае, если вы не используете несколько соединений, потому что HTTP может повторно использовать соединение после запроса.
Роберт
1
Означает ли это, что если вы установите тайм-аут сокета (например, 1 мин), то соединение будет прервано через 1 минуту бездействия, тогда как оно обычно используется повторно, если тайм-аут не установлен?
Роберт
2
@Robert Вы не обязательно получите исключение подключения, если сервер слишком занят. Это зависит от платформы, от серверной платформы. Тайм-аут чтения сокета не прерывает соединение. Это просто вызывает SocketTimeoutException. Приложение должно принять решение о том, можно ли по-прежнему использовать соединение. В API определенно нет ничего, что говорило бы, что вы не можете попробовать больше операций ввода-вывода на сокете. Ваше заявление об отказе от тайм-аутов при использовании нескольких подключений не имеет смысла. Здесь слишком много дезинформации.
Marquis of Lorne
83

Тайм - аут соединения максимальное количество времени , что программа готова ждать , чтобы установить соединение с другим процессом. На этом этапе вы не получаете и не публикуете данные приложения, а просто устанавливаете само соединение.

Тайм - аут сокета является тайм - аут во время ожидания для отдельных пакетов. Распространенное заблуждение, что тайм-аут сокета - это тайм-аут для получения полного ответа. Таким образом, если у вас есть тайм-аут сокета в 1 секунду и ответ состоит из 3 IP-пакетов, где каждый ответный пакет доставляется через 0,9 секунды, при общем времени ответа 2,7 секунды, то тайм-аута не будет.

entpnerd
источник
3
Ладно. 1. Итак, можно ли сказать, что SocketTimeout появляется только тогда, когда соединение уже установлено? 2. Что делать, если нет потока данных, скажем, через 5 минут после получения 3 пакетов? Будет ли исключение SocketTimeout после получения 3-го пакета?
Саураб Патил
2
@SaurabhPatil 1. Да. Для подтверждения см . Технический обзор протокола HTTP в Википедии . 2. После отправки сообщения о конце дальнейшие данные не требуются, поэтому тайм-аут сокета не возникает. См. Ответ по теме.
entpnerd
7
Хотелось бы, чтобы они назвали «тайм-аут сокета» как «тайм-аут простоя».
Manish Maheshwari