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

Delphi TServerSocket/TClientSocket 開發 TCP 通訊程式:多客戶端伺服器架構

     編輯:Delphi

元件簡介

TServerSocket、TClientSocket 為 Delphi 早期內建 Socket 元件 (現已標記棄用,建議改用 Indy),採用非阻塞/事件驅動模型 (stNonBlocking),適合學習 Socket 基本架構。

伺服器端關鍵設計:客戶端連線管理陣列

為了支援多客戶端並能精確回覆對應連線,維護一筆記錄陣列:

type
  TClientRecord = record
    Handle: Integer;           // Socket Handle
    Socket: TCustomWinSocket;  // 通訊 Socket 物件
    Name: string;              // 客戶端電腦名
    Address: string;           // 客戶端 IP
    Used: Boolean;             // 該槽位是否在用
  end;

const MAX_CLIENTS = 10;
var
  Clients: array[0..MAX_CLIENTS] of TClientRecord;
  ClientCount: Integer;

核心事件處理

客戶端連線 (OnClientConnect)

procedure TFormServer.ServerSocketClientConnect(Sender: TObject; Socket: TCustomWinSocket);
var
  i: Integer;
begin
  // 尋找空槽或擴充
  for i := 0 to ClientCount do
    if not Clients[i].Used then Break;
  if i = ClientCount then Inc(ClientCount);

  Clients[i].Handle := Socket.SocketHandle;
  Clients[i].Socket := Socket;
  Clients[i].Name := Socket.RemoteHost;
  Clients[i].Address := Socket.RemoteAddress;
  Clients[i].Used := True;

  StatusBar1.Panels[0].Text := 'Client connected: ' + Socket.RemoteHost;
end;

接收資料並回覆 (OnClientRead)

procedure TFormServer.ServerSocketClientRead(Sender: TObject; Socket: TCustomWinSocket);
var
  i: Integer;
  Received: string;
begin
  Received := Socket.ReceiveText;
  MemoLog.Lines.Add(Received);

  // 找到對應記錄並回覆
  for i := 0 to ClientCount do
    if Clients[i].Handle = Socket.SocketHandle then
    begin
      Clients[i].Socket.SendText('Server Reply => ' + EditReply.Text);
      Break;
    end;
end;

客戶端斷線 (OnClientDisconnect)

procedure TFormServer.ServerSocketClientDisconnect(Sender: TObject; Socket: TCustomWinSocket);
var
  i: Integer;
begin
  for i := 0 to ClientCount do
    if Clients[i].Handle = Socket.SocketHandle then
    begin
      Clients[i].Used := False;
      Clients[i].Handle := 0;
      Break;
    end;
  StatusBar1.Panels[0].Text := 'Client disconnected: ' + Socket.RemoteHost;
end;

客戶端程式

procedure TFormClient.ClientSocketConnect(Sender: TObject; Socket: TCustomWinSocket);
begin
  btnSend.Enabled := True;
  StatusBar1.Panels[0].Text := 'Connected to ' + Socket.RemoteHost;
end;

procedure TFormClient.btnSendClick(Sender: TObject);
begin
  ClientSocket.Socket.SendText(EditMsg.Text);
end;

procedure TFormClient.ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket);
begin
  MemoLog.Lines.Add(Socket.ReceiveText);
end;

屬性設定重點

  • ServerSocket.Port := 1025、ServerType := stNonBlocking、ThreadCacheSize := 10。
  • ClientSocket.Port := 1025、ClientType := stNonBlocking、Host := 'ServerIP'。

遷移建議

新專案請使用 Indy (TIdTCPServer/TIdTCPClient) 或 System.Net.Sockets (TcpClient/TcpListener),提供阻塞式 API、SSL、執行緒池、跨平台支援,並獲得持續更新。

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