cmd: string;

ASize, TotalSize: Int64;

AFileStream: TFileStream;

begin

IdTCPClient1.Host := Edit1.Text; //

连接主机

IdTCPClient1.Port := StrToIntDef(Edit2.Text, 9925); //

端口

IdTCPClient1.Connect; //

连接

IdTCPClient1.WriteLn('BEGIN'); //

提示服务器开始接收

cmd := IdTCPClient1.ReadLn;

//

“|”

符号分离文件名

SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));

if not SaveDialog1.Execute then

begin

IdTCPClient1.WriteLn('CANCEL'); //

告诉服务器取消

IdTCPClient1.Disconnect; //

断开连接

exit;

end;

TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //

分离文件大小

//

建立文件流准备接收

AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);

try //

循环开始接受

repeat

IdTCPClient1.WriteLn(IntToStr(AFileStream.Size));//

发送当前传输的位置

ASize := Min(TotalSize - AFileStream.Size, IdTCPClient1.RecvBufferSize);

//

选择剩余大小和缓冲区大小小的一个作为传输的大小

IdTCPClient1.ReadStream(AFileStream, ASize); //

接收流

StatusBar1.SimpleText := Format('

当前传输位置

%d/

大小

%d', [AFileStream.Size,

TotalSize]);

Application.ProcessMessages;

until AFileStream.Size = TotalSize; //

大小一致了表示结束

finally

AFileStream.Free; //

释放文件流

IdTCPClient1.WriteLn('END'); //

提示服务器传输完成