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

基於 UDP 廣播的局域網即時通訊程序(C# 實現)

     編輯:關於C語言

專案概述

本文介紹一個無需客戶端/服務端架構的局域網聊天工具,採用 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(上線)。
  • 所有在線客戶端監聽該端口,收到命令 0 回覆自身信息並加入列表。
  • 點擊「刷新」按鈕重發廣播,實現動態發現。

文件傳輸流程

  1. 發送方選擇文件,計算大小決定進度單位(K/M),發送命令 2(請求傳文件)含文件名+大小。
  2. 接收方彈出確認對話框,用戶選擇保存路徑後發送命令 3(準備好接收)。
  3. 發送方主動連接接收方 TCP 埠 2626,分塊發送文件流,雙端顯示進度條。

關鍵技術點

跨線程 UI 更新

代碼中直接在工作線程操作控件(如 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);

阻塞式 TCP 文件傳輸

接收端使用 TcpListener.AcceptSocket() 阻塞等待,發送端 TcpClient.Connect 主動連接,雙方通過 NetworkStream 讀寫字節數組。

代碼結構說明

  • Form1_Load:初始化網絡、啟動監聽線程、發送上線包。
  • ListenPort:UDP 監聽循環,調用 checkMessage 分發處理。
  • checkMessage:根據 CommandNo 分發邏輯(上線、聊天、文件請求、文件傳輸、確認)。
  • sendFile/listenPort:TCP 文件收發線程,含進度條更新邏輯。
  • WndProc 未重寫,熱鍵註冊見文章 82891。

已知問題與改進建議

  1. 線程安全: 移除 CheckForIllegalCrossThreadCalls = false,全部 UI 操作改用 Invoke。
  2. 廣播風暴: 局域網大量用戶同時上線會產生廣播風暴,建議加入隨機退避或改用組播。
  3. 編碼問題: 使用 Encoding.Default 依賴系統代碼頁,跨系統可能亂碼,建議統一 UTF-8。
  4. 異常處理: 网络操作缺乏重試與超時機制,文件傳輸中斷無法斷點續傳。
  5. 架構升級: 可引入 async/await、System.IO.Pipelines、MessagePack 序列化,重構為現代化網絡層。

總結

這是一個經典的「教學級」局域網聊天示例,展示了 UDP 廣播發現、TCP 文件傳輸、WinForms 多線程交互的核心模式。雖然代碼風格較老舊,但邏輯清晰,非常適合初學者研讀網絡編程基礎。實戰項目請參考上述改進建議重構。

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