?? u_client.pas
字號:
unit U_Client;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, Math,
StdCtrls, ComCtrls;
type
Tfrm_Client = class(TForm)
SaveDialog1: TSaveDialog;
IdTCPClient1: TIdTCPClient;
Button1: TButton;
StatusBar1: TStatusBar;
Edit1: TEdit;
Label1: TLabel;
Edit2: TEdit;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frm_Client: Tfrm_Client;
implementation
{$R *.dfm}
procedure Tfrm_Client.Button1Click(Sender: TObject);
var
cmd: string;
ASize, TotalSize: Int64;
AFileStream: TFileStream;
begin
IdTCPClient1.Host := Edit1.Text; //連接主機
IdTCPClient1.Port := StrToIntDef(Edit2.Text, 9925); //端口
IdTCPClient1.Connect; //連接
try
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; //釋放文件流
end;
IdTCPClient1.WriteLn('END'); //提示服務器傳輸完成
StatusBar1.SimpleText := '傳輸完成...';
except
StatusBar1.SimpleText := '連接服務器失敗或者對方已經中斷傳輸!';
end;
IdTCPClient1.Disconnect;
end;
end.
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -