首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 2009 Indy 實戰:TCP 協議聊天與檔案傳輸完整範例

     編輯:Delphi

基於 Indy 10 的多執行緒 TCP Server/Client:命令佇列、檔案傳輸進度、斷線重連

本文移植自 Delphi 盒子範例,升級至 Delphi 2009 (Unicode) 版本。Server 採 TIdTCPServer + TIdSchedulerOfThreadPool 執行緒池,支援多客戶端並發。通訊協定採行為導向文字命令:LOGIN、SENDT (文字)、SENDF (檔案)、FILE/SIZE/READY/OK/DONE 檔案傳輸握手。Client 端使用 TTimer 輪詢非阻塞接收。

Server 核心架構

  • TUser 類別封裝客戶端狀態:IP、Port、UserName、TIdContext、命令佇列 (TThreadList)、UI 同步鎖
  • TIdTCPServer.OnExecute:輪詢 CheckForDataOnSource(250)、處理輸入文字、從佇列取出命令發送
  • OnConnect/OnDisconnect:建立/銷毀 TUser、UI 列表同步更新 (PostMessage)
  • 檔案傳輸:LargeStream=True、OnWork 事件回報進度、Write(FileStream, Size) 發送

Client 核心邏輯

  • 連線後送出電腦名稱作為 UserName 登入
  • TTimer (250ms) 呼叫 CheckForDataOnSource、ReadLn 解析命令
  • 檔案接收:ReadInt64 取得大小 → ReadStream 寫入檔案 → 回覆 OK
  • 進度條顯示 OnWork 事件

關鍵程式碼片段 (Server 發送檔案)


Connection.IOHandler.WriteLn(Format('FILE %s', [ExtractFileName(FileName)]));
Str := Connection.IOHandler.ReadLn;
if SameText(Str, 'SIZE') then begin
  FStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  Connection.IOHandler.Write(ToBytes(FStream.Size)); // 發送 8 位元組大小
  Str := Connection.IOHandler.ReadLn;
  if SameText(Str, 'READY') then begin
    Connection.IOHandler.LargeStream := True;
    Connection.OnWork := AUser.DoWork; // 進度回呼
    AUser.FWorkSize := FStream.Size;
    Connection.IOHandler.Write(FStream, FStream.Size);
    Connection.OnWork := nil;
    Connection.IOHandler.LargeStream := False;
  end;
end;

關鍵程式碼片段 (Client 接收檔案)


FSize := IdTCPClient.IOHandler.ReadInt64(False);
pbProgress.Max := FSize;
IdTCPClient.IOHandler.WriteLn('READY');
FStream := TFileStream.Create(SaveFileName, fmCreate);
IdTCPClient.IOHandler.LargeStream := True;
IdTCPClient.IOHandler.ReadStream(FStream, FSize);
IdTCPClient.IOHandler.LargeStream := False;
IdTCPClient.IOHandler.WriteLn('OK');

部署注意事項

  • Indy 10 內建於 Delphi 2009,無需額外安裝
  • Server 需開放防火牆 Port (預設 3030)
  • Unicode 版本所有字串傳輸建議指定 enUTF8 編碼
  • 執行緒池 TIdSchedulerOfThreadPool 需在 uses 引用 IdSchedulerOfThreadPool

完整原始碼 (Server/Client 兩個專案) 可至原文連結下載。此範例展示 Indy 10 實作生產級 TCP 應用的完整模式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved