本文介紹一個無需客戶端/服務端架構的局域網聊天工具,採用 UDP 廣播發現用戶,TCP 傳輸文件,包含完整 WinForms 界面代碼。適合學習網絡編程、多線程與 Windows 消息機制。
自定義結構體 sendData 封裝所有數據包:
public struct SendData
{
public byte CommandNo; // 命令碼:0上線/刷新 1發言 2請求傳文件 3傳文件 9確認
public IPAddress FromIP; // 發送者 IP
public int NameLength; // 名稱字節長度
public string ComputerName; // 計算機名
public IPAddress ToIP; // 接收者 IP
public string Content; // 內容(文本/文件信息)
}
序列化採用手動 StructToBytes/BytesToStruct,按固定順序寫入字節數組,避免跨語言兼容性問題。
255.255.255.255:2525 發送命令 0(上線)。2626,分塊發送文件流,雙端顯示進度條。代碼中直接在工作線程操作控件(如 box.Items.Add),僅因設置 Control.CheckForIllegalCrossThreadCalls = false 繞過檢查。生產環境必須使用 Invoke/BeginInvoke 安全調度。
// 廣播發送
UdpClient client = new UdpClient(2525);
IPEndPoint ep = new IPEndPoint(IPAddress.Broadcast, 2525);
client.Send(buffer, buffer.Length, ep);
接收端使用 TcpListener.AcceptSocket() 阻塞等待,發送端 TcpClient.Connect 主動連接,雙方通過 NetworkStream 讀寫字節數組。
Form1_Load:初始化網絡、啟動監聽線程、發送上線包。ListenPort:UDP 監聽循環,調用 checkMessage 分發處理。checkMessage:根據 CommandNo 分發邏輯(上線、聊天、文件請求、文件傳輸、確認)。sendFile/listenPort:TCP 文件收發線程,含進度條更新邏輯。WndProc 未重寫,熱鍵註冊見文章 82891。CheckForIllegalCrossThreadCalls = false,全部 UI 操作改用 Invoke。Encoding.Default 依賴系統代碼頁,跨系統可能亂碼,建議統一 UTF-8。async/await、System.IO.Pipelines、MessagePack 序列化,重構為現代化網絡層。這是一個經典的「教學級」局域網聊天示例,展示了 UDP 廣播發現、TCP 文件傳輸、WinForms 多線程交互的核心模式。雖然代碼風格較老舊,但邏輯清晰,非常適合初學者研讀網絡編程基礎。實戰項目請參考上述改進建議重構。