При работе с загрузкой больших файлов через TNetHTTPClient в Delphi 12 разработчики часто сталкиваются с проблемой таймаутов соединения. Это может происходить из-за стандартных настроек, которые не учитывают длительность передачи больших объемов данных. В этой статье мы рассмотрим, как правильно настроить таймауты в TNetHTTPClient, чтобы избежать преждевременного разрыва соединения.
Проблема таймаутов в TNetHTTPClient
По умолчанию TNetHTTPClient использует следующие временные ограничения:
- ConnectionTimeout (время ожидания подключения) – обычно около 30 секунд.
- ResponseTimeout (время ожидания ответа) – также около 30 секунд.
- SendTimeout и ReceiveTimeout (таймауты на отправку и получение данных) – могут быть слишком малы для больших файлов.
При загрузке файлов размером в несколько гигабайт эти значения могут оказаться недостаточными, что приводит к ошибке ENetHTTPClientException с сообщением о таймауте.
Решение: Настройка таймаутов в TNetHTTPClient
Чтобы избежать преждевременного разрыва соединения, необходимо увеличить значения таймаутов. Рассмотрим несколько способов настройки.
1. Установка таймаутов через свойства TNetHTTPClient
Самый простой способ — задать нужные значения напрямую:
var
HTTPClient: TNetHTTPClient;
begin
HTTPClient := TNetHTTPClient.Create(nil);
try
// Увеличиваем таймауты
HTTPClient.ConnectionTimeout := 300000; // 5 минут на подключение
HTTPClient.ResponseTimeout := 0; // Без ограничения времени ожидания ответа
HTTPClient.SendTimeout := 300000; // 5 минут на отправку
HTTPClient.ReceiveTimeout := 300000; // 5 минут на загрузку
// Загрузка файла
HTTPClient.Get('https://example.com/largefile.zip');
finally
HTTPClient.Free;
end;
end;
Установка ResponseTimeout := 0 отключает ограничение на ожидание ответа, что полезно для длительных операций.
2. Использование TNetHTTPRequest для более тонкой настройки
Если требуется дополнительный контроль, можно использовать TNetHTTPRequest:
var
HTTPRequest: TNetHTTPRequest;
HTTPClient: TNetHTTPClient;
begin
HTTPClient := TNetHTTPClient.Create(nil);
HTTPRequest := TNetHTTPRequest.Create(nil);
try
HTTPRequest.Client := HTTPClient;
// Настройка таймаутов
HTTPClient.ConnectionTimeout := 60000; // 1 минута на подключение
HTTPClient.ResponseTimeout := 0; // Без ограничений
HTTPClient.SendTimeout := 300000; // 5 минут
HTTPClient.ReceiveTimeout := 300000; // 5 минут
// Загрузка с обработкой прогресса
HTTPRequest.OnReceiveData :=
procedure(const Sender: TObject; AContentLength, AReadCount: Int64; var AAbort: Boolean)
begin
// Вывод прогресса загрузки
Writeln(Format('Загружено: %d из %d байт', [AReadCount, AContentLength]));
end;
HTTPRequest.Get('https://example.com/largefile.zip');
finally
HTTPRequest.Free;
HTTPClient.Free;
end;
end;
3. Альтернативный подход: Разделение загрузки на части
Если сервер поддерживает докачку (resume download), можно реализовать загрузку по частям:
procedure DownloadInChunks(const AURL, AOutputFile: string; ChunkSize: Integer = 1048576);
var
HTTPClient: TNetHTTPClient;
Stream: TFileStream;
StartByte, EndByte: Int64;
Response: IHTTPResponse;
begin
HTTPClient := TNetHTTPClient.Create(nil);
Stream := TFileStream.Create(AOutputFile, fmCreate or fmOpenWrite);
try
HTTPClient.ReceiveTimeout := 300000; // 5 минут на загрузку части
StartByte := 0;
repeat
EndByte := StartByte + ChunkSize - 1;
// Устанавливаем диапазон загрузки
HTTPClient.CustomHeaders['Range'] := Format('bytes=%d-%d', [StartByte, EndByte]);
Response := HTTPClient.Get(AURL);
if Response.StatusCode = 206 then // 206 - Partial Content
begin
Stream.CopyFrom(Response.ContentStream, 0);
Inc(StartByte, ChunkSize);
end
else
Break; // Завершаем, если сервер не поддерживает докачку
until False;
finally
Stream.Free;
HTTPClient.Free;
end;
end;
Заключение
Настройка таймаутов в TNetHTTPClient позволяет избежать преждевременного разрыва соединения при загрузке больших файлов. Основные рекомендации:
- Увеличить ConnectionTimeout, SendTimeout и ReceiveTimeout.
- Отключить ResponseTimeout или установить большое значение.
- Использовать докачку, если сервер поддерживает частичную загрузку.
Приведенные примеры помогут адаптировать загрузку файлов под ваши требования и обеспечить стабильную работу приложения.
Способы предотвращения таймаута соединения при загрузке больших файлов в Delphi 12 с использованием NetHTTPClient путем настройки соответствующих параметров.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.