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

C# 網路版鬥地主網路通訊層實作詳解:Server/Client 架構與訊息轉發

     編輯:關於C語言

網路架構總覽

採用經典 Server-Client 架構,Server 負責監聽連線、管理遊戲狀態、轉發訊息;Client 負責 UI 互動與 Server 通訊。兩個 Client 之間無直連,所有通訊經 Server 代理。

Server 端核心流程

  1. 啟動監聽:new Server() 綁定預設埠 1991,Listen()。
  2. 等待雙玩家:背景執行緒 while(true) 輪詢 AcceptTcpClient(),收集兩個 NetworkStream。
  3. 啟動接收執行緒:分別為 Client1、Client2 建立 AcceptClient1Data、AcceptClient2Data 執行緒持續讀取資料。
  4. 訊息轉發:SendDataForClient(msg, clientIndex) 向指定 Client 發送位元組陣列。

Client 端核心流程

  1. 連線 Server:new Client().Connect(serverIP, 1991)。
  2. 啟動接收執行緒:AcceptServerData() 持續讀取 Server 推送訊息。
  3. 發送訊息:SendDataForServer(msg) 向 Server 上報動作。

關鍵協定設計 (原始版本)

  • 固定緩衝區:byte[108],極度不靈活,易造成資料截斷或讀取殘留。
  • 字串前綴協定:"StartPokers" + 序列化牌組、"OK"、"AreYouLandLord" 等。
  • 序列化:PokerGroup 自行實作 byte[] 序列化/反序列化。

流程時序圖

Server 流程圖
Client 流程圖

嚴重缺陷與改進方向

問題影響改進建議
固定 108 bytes 緩衝區長訊息截斷、短訊息殘留干擾採用 長度前綴 或 分隔符 協定,動態緩衝區
阻塞式 Read 無逾時網路卡頓導致執行緒卡死使用 NetworkStream.ReadAsync + CancellationToken
無心跳/重連機制斷線無法恢復實作 Ping/Pong 心跳,Client 端自動重連邏輯
字串解析協定效能低、易誤判、難擴充改用 Protobuf / MessagePack / JSON 序列化
Thread.Sleep 同步UI 凍結、延遲不可控全面改為 async/await 非同步模式

原始碼片段 (Server 接收迴圈)

public void AcceptClient1Data() {
    var ns = _client1.GetStream();
    while (true) {
        byte[] buffer = new byte[108];
        int read = ns.Read(buffer, 0, buffer.Length); // 阻塞讀取
        string msg = Encoding.Default.GetString(buffer, 0, read);
        ProcessMessage(msg, 1); // 解析並分派
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved