TCP 是位元組串流協定,無訊息邊界。連續發送 "msg1"、"msg2",接收端可能收到 "msg1msg2" 或 "msg1ms" + "g2"。同機測試常正常,跨機器必現問題。
\n) 標記訊息結束StreamReader.ReadLine() / StreamWriter.WriteLine() 簡化實作NetworkStream ns = tcpClient.GetStream();
StreamReader reader = new StreamReader(ns);
StreamWriter writer = new StreamWriter(ns) { AutoFlush = true };
// 發送
writer.WriteLine("Welcome to server"); // 自動加 \n
// 接收
string msg = reader.ReadLine(); // 讀到 \n 為止
// 發送
byte[] data = Encoding.ASCII.GetBytes("message");
ns.Write(data, 0, data.Length);
// 接收 (需自行處理邊界)
byte[] buffer = new byte[1024];
int read = ns.Read(buffer, 0, buffer.Length);
string msg = Encoding.ASCII.GetString(buffer, 0, read);
| 場景 | 推薦策略 |
|---|---|
| 高效能二進位協定、已知最大長度 | 固定長度 |
| 一般雙向通訊、可變長度資料 | 長度前綴 |
| 簡單文字指令協定 (如 SMTP、HTTP Header) | 分隔符 (CRLF) |
| 現有協定規定特定分隔符 | 分隔符 |