Tôi đang phát triển Máy chủ FTP với Delphi XE 6 và Indy10. Vấn đề là tôi cần phải hạn chế tốc độ tải xuống (phải được cấu hình Ex. 1 KB/s, 1 MB/s, vv) và tôi không làm cho nó hoạt động. Tôi biết một số đạo cụ như BitsPerSec, vv nhưng điều này chỉ ảnh hưởng đến trao đổi dữ liệu giao thức, không phải trao đổi tập tin với lệnh RETR. Tôi thấy trong IdFTPServer.pass và Stream được chuyển đổi thành chuỗi và gửi với một vòng lặp lặp lại/cho đến khi (với IOHandler.Write()) nhưng tôi cần một số hình thức kiểm soát quá trình tải lên/tải xuống và có thể giới hạn tốc độ cho tất cả các kết nối máy khách đến. Một số giúp đỡ để đạt được điều này xin vui lòng ?.Cách giới hạn tốc độ của các tệp đã truy xuất bằng IndyFtpServer (v10)
PD: Xin lỗi vì tiếng anh nghèo của tôi.
tôi cố gắng thực hiện một CommandHandler cho lệnh RETR với mã này:
procedure TForm1.IdFTPServer1CommandHandlers0Command(ASender: TIdCommand);
var
LContext : TIdFTPServerContext;
vStream: TFileStream;
path: String;
vX: Integer;
LEncoding: IIdTextEncoding;
begin
LEncoding := IndyTextEncoding_8Bit;
LContext := ASender.Context as TIdFTPServerContext;
path := 'D:\indy_in_depth.pdf';
try
vStream := TFileStream.Create(path, fmOpenRead);
//LContext.DataChannel.FtpOperation := ftpRetr;
//LContext.DataChannel.Data := VStream;
LContext.DataChannel.OKReply.SetReply(226, RSFTPDataConnClosed);
LContext.DataChannel.ErrorReply.SetReply(426, RSFTPDataConnClosedAbnormally);
ASender.Reply.SetReply(150, RSFTPDataConnToOpen);
ASender.SendReply;
Memo1.Lines.Add('Sending a file with: ' + IntToStr(vStream.Size) + ' bytes');
//Make control of speed here !
for vX := 1 to vStream.Size do
begin
vStream.Position := vX;
LContext.Connection.IOHandler.Write(vStream, 1, False);
if vX mod 10000 = 0 then
Memo1.Lines.Add('Sended byte: ' + IntToStr(vX));
end;
//LContext.DataChannel.InitOperation(False);
//LContext.Connection.IOHandler.Write(vStream);
//LContext.KillDataChannel;
LContext.Connection.Socket.Close;
VStream.Free;
except
on E: Exception do
begin
ASender.Reply.SetReply(550, E.Message);
end;
end;
end;
Nhưng Filezilla FTP dữ liệu khách hàng cho thấy dòng như một phần của lệnh khác.
Bạn là người tốt nhất. Tôi làm một số sai lầm khi đọc mã, nhưng đây chỉ là những gì tôi cần. Tôi đang làm việc 5 giờ sáng, vì vậy mắt và não trong điều kiện xấu lol. Tôi làm một số Throttle với bạn lớp BufferedFileStream tuyệt vời (với một số calc và một số giấc ngủ). Nhưng bây giờ tôi thấy điều này và là cách hoàn hảo. Cảm ơn rất nhiều lần nữa! Với đại diện này tôi không thể tạo nên phiếu bầu. – WoNDeR