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

C# 網路程式設計:非同步傳輸字串 (2) — 訊息邊界問題與自訂協議設計

     編輯:關於C語言

核心問題:TCP 訊息邊界不保留

客戶端分兩次 Write(),主觀上是兩個請求;但伺服器可能合併成一條,或將一條拆成兩條。若客戶端連續發送三次 Welcome to TraceFact.Net!,伺服器端可能出現三種情況:

註:假設 ASCII 編碼,每格代表 1 位元組,字串結尾為連續 0。

  1. 理想:兩條獨立請求完整接收。
  2. 拆分:一條訊息被當作兩條接收。
  3. 合併:兩條訊息合併成一條接收。

實測重現合併現象

修改客戶端用 for 迴圈連續發送三次,縮短間隔:

string msg = "Welcome to TraceFact.Net!";
for (int i = 0; i <= 2; i++) {
    byte[] buffer = Encoding.Unicode.GetBytes(msg);
    try {
        streamToServer.Write(buffer, 0, buffer.Length);
        Console.WriteLine("Sent: {0}", msg);
    } catch (Exception ex) {
        Console.WriteLine(ex.Message); break;
    }
}

執行結果確實出現合併:

解決方案:自訂應用層協議

參考 HTTP 模式,在實際內容前加入「中繼資料」。定義協議:[length=XXX],XXX 為字串**字元數**(非位元組數)。例如:[length=25]Welcome to TraceFact.Net!。

伺服器讀取流程:

  1. 先解析中括號內的 length。
  2. 比對後續字串長度:
     • 相等 → 完整訊息。
     • 較多 → 取出所需長度,剩餘緩存(可能為下一條訊息)。
     • 較少 → 不完整,整段緩存等待下次資料合併處理。
  3. 若中括號本身不完整(被截斷),整段緩存等待下次合併再解析。

此問題屬純字串處理,非網路程式核心。下節將直接實作處理上述四種情況的 RequestHandler 類別。

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