ConnectionTimeout та SocketTimeout


135

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

В основному, коли я це роблю (час очікування в мілісекундах)

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

Не генерується жоден виняток таймауту, і він працює нормально, проте коли я виконую наступне

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

Я отримую Socket Exception.

Отже, моє запитання: чому я не можу імітувати виняток підключення? Чи я не розумію різницю між розеткою та тайм-аутом підключення? Бібліотека тут (поки офіційно не випущена).

Відповіді:


227

Тайм - аут з'єднання відбувається тільки при запуску з'єднання TCP. Зазвичай це відбувається, якщо віддалений апарат не відповідає. Це означає, що сервер був вимкнений, ви використовували неправильне ім’я IP / DNS, неправильний порт або відключено мережеве з'єднання з сервером.

Тайм - аут сокета призначений для моніторингу безперервного вхідного потоку даних. Якщо потік даних перервано протягом зазначеного часу, з'єднання вважається зупиненим / розірваним. Звичайно, це працює лише з з'єднаннями, де дані отримуються постійно.

Встановивши тайм-аут сокета в 1, це вимагатиме отримання кожного нового мілісекунди нових даних (якщо припустити, що ви читаєте блок даних мудро і блок достатньо великий)!

Якщо тільки вхідний потік зупиняється більше мілісекунди, ви зіткнулися з таймаутом.


1
Чи можете ви коли-небудь отримати тайм-аут з'єднання, якщо сервер не працює, але зайнятий? Або це був би час очікування розетки?
Роберт

9
Це залежить - якщо TCP-з'єднання було встановлено до перевантаження сервера, ви отримаєте виняток сокета - інакше ви отримаєте виняток з з'єднання, що вказує на те, що з'єднання TCP не вдалося встановити.
Роберт

2
Зважаючи на високу затримку особливо старших мобільних мереж, час очікування з'єднання має бути встановлено на кілька секунд (наприклад, 10 секунд або краще 10000 мсек). Час очікування розетки я встановив би лише якщо ви не використовуєте декілька з'єднань, оскільки HTTP може повторно використовувати з'єднання після запиту.
Роберт

1
Чи означає це, що якщо встановити тайм-аут сокета (наприклад, 1 хв), то з'єднання буде перервано після 1 хвилини бездіяльності, де, як правило, його повторно використовувати, якщо не встановлено тайм-аут?
Роберт

2
@Robert Ви не обов'язково отримаєте виняток підключення, якщо сервер занадто зайнятий. Це на платформі, залежно від платформи сервера. Час очікування зчитування сокета не вбиває з'єднання. Це просто викликає SocketTimeoutException. Чи є з'єднання все-таки корисним - це рішення, яке має прийняти програма. Про API точно немає нічого, що говорить, що ви не можете спробувати більше вводу-виводу на сокет. Ваша заява про те, що не використовувати тайм-аути, якщо ви використовуєте декілька з'єднань, не має сенсу. Тут занадто багато дезінформації.
Маркіз Лорн

83

Тайм - аут з'єднання максимальну кількість часу , що програма готова чекати , щоб з'єднатися з іншим процесом. На даний момент ви не отримуєте та не публікуєте жодних даних програми, просто встановіть з'єднання.

Тайм - аут сокета є тайм - аут під час очікування для окремих пакетів. Поширена помилкова думка, що час очікування розетки - це час очікування для отримання повної відповіді. Отже, якщо у вас є час очікування розетки в 1 секунду, і відповідь складається з 3 пакетів IP, де для кожного пакета відповідей потрібно 0,9 секунди, загальний час відповіді 2,7 секунди, то час очікування не буде.


3
Добре. 1. Отже, чи можна сказати, що SocketTimeout з'являється лише тоді, коли вже встановлено З'єднання? 2. Що робити, якщо немає потоку даних, наприклад, через 5 хвилин після отримання 3 пакетів? Чи буде виняток SocketTimeout після отримання 3-го пакету?
Saurabh Patil

2
@SaurabhPatil 1. Так. Для підтвердження дивіться Технічний огляд Вікіпедії протоколу HTTP . 2. Після надсилання повідомлення в кінці більше ніяких даних не потрібно, тому час очікування розетки не відбудеться. Дивіться цю відповідь по темі.
entpnerd

7
Я б хотів, щоб вони назвали "timeout timeout" як "timeout timeout".
Маніш Махешварі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.