Delphi Indy TCPClient/TCPServer元件傳檔

Indy這套免費又強大的網路元件相信對Delphi開發者不陌生,不過常常被問如何透過Indy傳送檔案。
寫了個簡單的範例給大家。

一、伺服端
只需要在表單放上一個IdTCPServer元件,接著在FormOnCreate以及IdTCPServer1OnExecute寫上
[pascal]
procedure TForm1.FormCreate(Sender: TObject);
begin
idtcpserver1.DefaultPort := 1234; // 可自行更改Port號,但Client/Server要一致
idtcpserver1.Active:=true;
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
ms:Tfilestream;
fn:String;
begin
fn := ExtractFileName(acontext.Connection.IOHandler.ReadLn()); // 從Client接收檔名
ms := Tfilestream.Create(‘c:\’+fn, fmCreate);
ms.Position :=0;
acontext.Connection.IOHandler.ReadStream(ms,0,true);
ms.Free;
end;
[/pascal]

二、客戶端
畫面上放上IdTCPClient外,再放上三個Edit(分別是EdtHost、EdtPort、EdtFileName)以及四個Button(分別是BtnConnect、BtnDisConnect、BtnChooseFile、BtnSend)以及一個OpenDialog
[pascal]
procedure TForm1.BtnConnectClick(Sender: TObject);
begin
// 連接到伺服器
if IdTCPClient1.Connected then
IdTCPClient1.Disconnect;
IdTCPClient1.Host := EdtHost.Text;
IdTCPClient1.Port := StrToInt(EdtPort.Text);
IdTCPClient1.Connect;
end;

procedure TForm1.BtnDisconnectClick(Sender: TObject);
begin
// 斷開連線
IdTCPClient1.Disconnect;
end;

procedure TForm1.BtnChooseFileClick(Sender: TObject);
begin
// 選擇檔案
if opendialog1.Execute then begin
EdtFileName.Text :=opendialog1.FileName;
end;
end;

procedure TForm1.BtnSendClick(Sender: TObject);
var
ms : tmemorystream;
begin
// 傳送檔案
BtnConnect.Click;
ms := Tmemorystream.Create;
ms.Clear;
ms.LoadFromFile(EdtFileName.Text);
ms.Position :=0;
IdTCPClient1.IOHandler.LargeStream := true;
idtcpclient1.IOHandler.WriteLn(ExtractFileName(EdtFileName.Text)); // 告知檔名
idtcpclient1.IOHandler.Write(ms);
idtcpclient1.IOHandler.Close; // 很重要的一行,不然傳送完,無法開啟會出現檔案使用中
ms.Free;
end;
[/pascal]