本文展示三個遞進範例:基本 UDP Server/Client、加入 TIdAntiFreeze 解決同步阻塞導致界面凍結、Client 端廣播 SearchHost 自動發現區域網路 Server。
TIdUDPServer.OnUDPRead 取得 ABinding.PeerIP/Port 與 BytesToString(AData),回覆 Send(PeerIP, PeerPort, 回應字串)Broadcast(訊息, Port) 發送廣播,ReceiveString(-1) 同步等待回應同步 ReceiveString 會阻塞主執行緒,導致 UI 凍結。在 Server/Client 表單各放一個 TIdAntiFreeze,即可在阻塞時處理訊息佇列,保持 UI 響應。Client 端更可移除 TTimer,直接同步收發:
IdUDPClient1.Broadcast(Edit1.Text, 3030);
Edit2.Text := IdUDPClient1.ReceiveString(-1); // 配合 AntiFreeze 不凍結
並設定 ReceiveTimeout := 5000 避免永久等待。
'SearchHost''SearchHost' 回覆自身 IP
IdUDPClient1.BroadcastEnabled := True;
IdUDPClient1.Broadcast('SearchHost', 3030);
ipaddr := IdUDPClient1.ReceiveString();
if IpList.IndexOf(ipaddr) = -1 then IpList.Add(ipaddr);
ReceiveString 阻塞至 Timeout,UI 仍會短暫卡頓 (AntiFreeze 只能緩解)TIdUDPClient 非同步事件 OnUDPRead,或另開執行緒輪詢UDP 無連線、低延遲、支援廣播/組播,是 LAN 服務發現的首選協議。Indy 封裝使 Delphi 實作極為簡潔。作者:wy (原文署名)。