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;
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;
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;
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、執行緒池、跨平台支援,並獲得持續更新。