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

Регулировка скорости загрузки файлов в Delphi XE 6 с Indy 10

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

Регулировка скорости загрузки файлов в Delphi XE 6 с Indy 10

При разработке FTP-сервера с использованием Delphi XE 6 и Indy 10 может возникнуть потребность в ограничении скорости загрузки файлов. В данной статье мы рассмотрим, как это можно сделать, используя встроенные возможности Indy и перехватчик потока данных.

Оригинальный вопрос:

Я разрабатываю FTP-сервер с использованием Delphi XE 6 и Indy 10. У меня есть проблема: мне нужно ограничить скорость загрузки файлов (например, 1 КБ/с, 1 МБ/с и т. д.), и я не могу этого добиться. Я знаю некоторые свойства, такие как BitsPerSec, но они влияют только на обмен данными протокола, не на обмен файлами с помощью команды RETR. Я вижу в IdFTPServer.pas, что поток преобразуется в строку и отправляется с помощью цикла repeat/until (с помощью IOHandler.Write()), но мне нужен какой-то способ контроля процесса загрузки/выгрузки и возможность ограничить скорость для всех входящих клиентских подключений. Пожалуйста, помогите мне в этом вопросе.

Ответ:

Для ограничения скорости загрузки файлов в Indy есть встроенный класс TIdInterceptThrottler, который можно использовать для ограничения скорости передачи данных. Экземпляр этого класса можно назначить любому объекту TIdTCPConnection через его свойство Intercept. Это не ограничивается только подключением к команде, его можно использовать и для подключений передачи данных.

Вы можете получить доступ к объекту TIdTCPConnection файловой передачи в TIdFTPServer через член TIdFTPServerContext.DataChannel.FDataChannel, как в событии OnRetrieveFile:

type
  // член TIdDataChannel.FDataChannel защищен,
  // поэтому используйте класс-доступ для его достижения...
  TIdDataChannelAccess = class(TIdDataChannel)
  end;

procedure TForm1.IdFTPServer1RetrieveFile(ASender: TIdFTPServerContext;
  const AFileName: TIdFTPFileName; var VStream: TStream);
var
  Conn: TIdTCPConnection;
begin
  Conn := TIdDataChannelAccess(ASender.DataChannel).FDataChannel;
  if Conn.Intercept = nil then
    Conn.Intercept := TIdInterceptThrottler.Create(Conn);
  TIdInterceptThrottler(Conn.Intercept).BitsPerSec := ...;
  VStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
end;

В качестве альтернативы вы можете создать собственный класс T(File)Stream, унаследованный от TStream, переопределить виртуальные методы Read() и Write() для выполнения собственного ограничения скорости и назначить экземпляр этого класса параметру VStream события OnRetrieveFile и OnStoreFile.

Примечание:

При чтении кода IdFTPServer.pas вы неправильно интерпретировали код. Поток не преобразуется в строку. Содержимое потока отправляется как есть в виде бинарных данных в единственном вызове метода IOHandler.Write(TStream).

Вы не должны непосредственно обрабатывать команду RETR. TIdFTPServer уже делает это для вас. Вместо этого используйте событие OnRetrieveFile для подготовки загрузок и событие OnStoreFile для загрузок.

Создано по материалам из источника по ссылке.

Контекст: Регулировка скорости загрузки файлов в Delphi XE 6 с Indy 10.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: FTP ::


реклама


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

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 13:27:18/0.0054318904876709/1