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

Delphi 2009 Indy 實戰:UDP 協議廣播與伺服器自動發現

     編輯:Delphi

UDP 基礎通訊、TIdAntiFreeze 防界面凍結、廣播尋找伺服器

本文展示三個遞進範例:基本 UDP Server/Client、加入 TIdAntiFreeze 解決同步阻塞導致界面凍結、Client 端廣播 SearchHost 自動發現區域網路 Server。

1. 基本 UDP Server/Client

  • Server:TIdUDPServer.OnUDPRead 取得 ABinding.PeerIP/Port 與 BytesToString(AData),回覆 Send(PeerIP, PeerPort, 回應字串)
  • Client:Broadcast(訊息, Port) 發送廣播,ReceiveString(-1) 同步等待回應

2. 加入 TIdAntiFreeze (關鍵)

同步 ReceiveString 會阻塞主執行緒,導致 UI 凍結。在 Server/Client 表單各放一個 TIdAntiFreeze,即可在阻塞時處理訊息佇列,保持 UI 響應。Client 端更可移除 TTimer,直接同步收發:


IdUDPClient1.Broadcast(Edit1.Text, 3030);
Edit2.Text := IdUDPClient1.ReceiveString(-1); // 配合 AntiFreeze 不凍結

並設定 ReceiveTimeout := 5000 避免永久等待。

3. UDP 廣播自動發現伺服器

  • Client 定時 (建議 5 秒) 廣播 'SearchHost'
  • Server 收到 'SearchHost' 回覆自身 IP
  • Client 收集去重後顯示於 ListBox

Client 發現邏輯核心碼


IdUDPClient1.BroadcastEnabled := True;
IdUDPClient1.Broadcast('SearchHost', 3030);
ipaddr := IdUDPClient1.ReceiveString();
if IpList.IndexOf(ipaddr) = -1 then IpList.Add(ipaddr);

已知問題與改進方向

  • Timer 間隔過短 佔用 CPU,建議 ≥ 5 秒或改用背景執行緒
  • 無伺服器回應時 ReceiveString 阻塞至 Timeout,UI 仍會短暫卡頓 (AntiFreeze 只能緩解)
  • 改進:Client 端改用 TIdUDPClient 非同步事件 OnUDPRead,或另開執行緒輪詢
  • Server 端可維護線上客戶列表,支援單播/組播精確通訊

適用場景

  • 區域網路遊戲大廳自動列出房間
  • IoT 設備自動發現配對
  • 分散式服務註冊發現 (輕量級)
  • 跨平台 LAN 訊息廣播

UDP 無連線、低延遲、支援廣播/組播,是 LAN 服務發現的首選協議。Indy 封裝使 Delphi 實作極為簡潔。作者:wy (原文署名)。

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