Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Предотвращение таймаута соединения при загрузке больших файлов в Delphi 12 с использованием NetHTTPClient: как настроить таймауты?

Delphi , Интернет и Сети , Интернет

 

При работе с загрузкой больших файлов через 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




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Интернет ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-12 12:20:06/0.0065510272979736/0