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

C# 網路程式設計:同步傳輸字串 (下) — 緩衝區處理與客戶端實作

     編輯:關於C語言

伺服器端:從資料流讀取字串

在上一節中,我們已經建立了伺服器與客戶端的連線。現在進入核心環節:如何從 NetworkStream 讀取資料並還原為字串。程式碼的上半部(建立 TcpListener、呼叫 AcceptTcpClient())已經很熟悉,這裡直接切入重點。

呼叫 remoteClient.GetStream() 取得連往客戶端的資料流,接著從流中讀取位元組存入 buffer 緩衝區,最後透過 Encoding.Unicode.GetString() 將位元組陣列轉為字串並輸出到主控台。

注意:緩衝區大小與資料截斷問題

固定大小的緩衝區(範例中為 8192 位元組)在處理大量資料時會發生截斷。當可讀取的總位元組數超過 BufferSize,單次 Read() 只會讀取緩衝區能容納的部分。對於圖片、檔案等大型物件,必須採用「分次讀取、再合併」的策略:

// 取得完整字串的正確做法
byte[] buffer = new byte[BufferSize];
int bytesRead;
MemoryStream msStream = new MemoryStream();
do {
    bytesRead = streamToClient.Read(buffer, 0, BufferSize);
    msStream.Write(buffer, 0, bytesRead);
} while (bytesRead > 0);

buffer = msStream.GetBuffer();
string msg = Encoding.Unicode.GetString(buffer);

本範例為求簡潔,且考量一般文字傳輸 8192 位元組(Unicode 下約 4096 字元)已足夠,故未採用上述寫法。不同編碼佔用位元組數差異極大,文末附有小程式可測試 Unicode、UTF-8、ASCII 三種編碼的位元組長度。

同步 Read() 的阻塞行為

不修改客戶端,先啟動伺服器再啟動客戶端。你會發現伺服器印出 Client Connected! 後再次卡住,並未輸出 Reading data...。這證明 Read() 同樣是同步阻塞方法:只有當客戶端真正發送資料時,伺服器才會繼續執行,否則會一直等待。

客戶端程式:發送字串給伺服器

客戶端邏輯與伺服器對稱:取得連往伺服器的資料流,將字串編碼為位元組陣列,呼叫 Write() 寫入流中,即完成發送。

class Client {
    static void Main(string[] args) {
        Console.WriteLine("Client Running ...");
        TcpClient client;

        try {
            client = new TcpClient();
            client.Connect("localhost", 8500); // 連線伺服器
        } catch (Exception ex) {
            Console.WriteLine(ex.Message);
            return;
        }

        // 顯示連線資訊
        Console.WriteLine("Server Connected!{0} --> {1}",
            client.Client.LocalEndPoint, client.Client.RemoteEndPoint);

        string msg = "\"Welcome To TraceFact.Net\"";
        NetworkStream streamToServer = client.GetStream();

        byte[] buffer = Encoding.Unicode.GetBytes(msg); // 編碼為位元組
        streamToServer.Write(buffer, 0, buffer.Length); // 發送
        Console.WriteLine("Sent: {0}", msg);

        // 按 Q 退出
    }
}

至此,同步模式下的「客戶端發送、伺服器接收並顯示」流程已完整串起。下一步將實作伺服器回應、客戶端接收的雙向通訊。

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