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]

作者: 林壽山

林壽山 軟體公司專案經理,第三方支付設計,金流設計,行動支付設計,支付寶,微信,街口支付,信用卡機,擅長PHP網頁設計(CodeIgniter、Laravel)框架、Delphi程式設計、資料庫設計、C# WinForm/WebForm程式設計

在〈Delphi Indy TCPClient/TCPServer元件傳檔〉中有 1 則留言

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。

這個網站採用 Akismet 服務減少垃圾留言。進一步瞭解 Akismet 如何處理網站訪客的留言資料