Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Connection Timeout в HTTPS
Connection timeout — это максимальное время ожидания, в течение которого клиент пытается установить соединение с сервером. Если соединение не установлено за это время, выбрасывается исключение SocketTimeoutException или ConnectException.
Различие между типами таймаутов
В HTTP/HTTPS общепринято различать два основных типа таймаутов:
- Connection Timeout (время подключения) — время на установку TCP соединения и выполнение TLS handshake
- Read Timeout (время чтения) — время, в течение которого клиент ждёт ответ от сервера после отправки запроса
- Write Timeout (время записи) — время на отправку данных серверу
Как работает Connection Timeout
При установке HTTPS соединения происходит следующее:
- TCP three-way handshake (SYN, SYN-ACK, ACK)
- TLS handshake (ClientHello, ServerHello, Certificate, Key Exchange и т.д.)
- Соединение готово к обмену данными
Если все эти этапы не завершены за отведённое время (connection timeout), соединение прерывается.
Пример с HttpURLConnection
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpTimeoutExample {
public static void main(String[] args) {
try {
URL url = new URL("https://api.example.com/data");
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Connection timeout: 5 секунд
connection.setConnectTimeout(5000);
// Read timeout: 10 секунд
connection.setReadTimeout(10000);
int responseCode = connection.getResponseCode();
System.out.println("Response Code: " + responseCode);
connection.disconnect();
} catch (java.net.SocketTimeoutException e) {
System.err.println("Connection timeout occurred: " + e.getMessage());
} catch (Exception e) {
System.err.println("Error: " + e.getMessage());
}
}
}
Пример с HttpClient (Java 11+)
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class HttpClientTimeoutExample {
public static void main(String[] args) throws Exception {
HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5)) // Connection timeout
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(new java.net.URI("https://api.example.com/data"))
.timeout(Duration.ofSeconds(10)) // Read timeout
.GET()
.build();
try {
HttpResponse<String> response = httpClient.send(request,
HttpResponse.BodyHandlers.ofString());
System.out.println("Status: " + response.statusCode());
System.out.println("Body: " + response.body());
} catch (java.net.http.HttpTimeoutException e) {
System.err.println("HTTP timeout: " + e.getMessage());
}
}
}
Пример с OkHttp
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import java.util.concurrent.TimeUnit;
public class OkHttpTimeoutExample {
public static void main(String[] args) throws Exception {
OkHttpClient httpClient = new OkHttpClient.Builder()
.connectTimeout(5, TimeUnit.SECONDS) // Connection timeout
.readTimeout(10, TimeUnit.SECONDS) // Read timeout
.writeTimeout(10, TimeUnit.SECONDS) // Write timeout
.build();
Request request = new Request.Builder()
.url("https://api.example.com/data")
.build();
try (Response response = httpClient.newCall(request).execute()) {
System.out.println("Status: " + response.code());
System.out.println("Body: " + response.body().string());
} catch (java.net.SocketTimeoutException e) {
System.err.println("Socket timeout: " + e.getMessage());
}
}
}
Рекомендуемые значения
- Connection Timeout: 5-10 секунд (для локальной сети), 10-30 секунд (для интернета)
- Read Timeout: 10-60 секунд (зависит от типа запроса)
- Write Timeout: аналогично read timeout
Обработка исключений
try {
// HTTP запрос
} catch (SocketTimeoutException e) {
// Таймаут соединения или чтения
logger.warn("Timeout occurred, retrying...");
} catch (ConnectException e) {
// Ошибка подключения
logger.error("Connection failed");
} catch (IOException e) {
// Прочие ошибки IO
logger.error("IO error occurred");
}
Важные моменты
- TLS handshake может быть долгим, особенно на мобильных сетях
- Connection pooling помогает избежать частых переподключений
- Слишком короткие таймауты приводят к false positives
- Слишком длинные таймауты замораживают приложение
- При retry логике важно различать ошибки и не повторять non-idempotent операции
Connection timeout в HTTPS критичен для создания отказоустойчивых приложений, так как сеть всегда ненадёжна.