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

C# 網路程式設計:同步傳輸字串 (上) — 建立連線與資料流基礎

     編輯:關於C語言

伺服器/客戶端通訊模型

連線建立後,雙方透過 資料流 (Stream) 傳輸資料。幾乎任何物件都可序列化存入流中,因此實際上可以在客戶端與伺服器之間傳輸任意類型的資料。

  • 客戶端視角:寫入流 = 發送資料給伺服器;讀取流 = 接收伺服器資料。
  • 伺服器視角:寫入流 = 發送資料給客戶端;讀取流 = 接收客戶端資料。

同步傳輸字串:任務拆解

本節實作一個完整來回流程:

  1. 客戶端印出字串並發送給伺服器。
  2. 伺服器接收並印出,將字串轉大寫後回傳。
  3. 客戶端接收回應並再次印出。

我們分兩部分講解:1. 客戶端發送、伺服器接收並輸出;2. 伺服器回發、客戶端接收並輸出。

1.1 伺服器端程式碼

在 TcpClient 上呼叫 GetStream() 取得連往遠端的資料流。注意「遠端」一詞:在客戶端呼叫時取得連往伺服器的流;在伺服器呼叫時取得連往客戶端的流。以下為伺服器核心程式碼(未使用 do/while 迴圈):

class Server {
    static void Main(string[] args) {
        const int BufferSize = 8192; // 緩衝區 8192 位元組

        Console.WriteLine("Server is running ... ");
        IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });
        TcpListener listener = new TcpListener(ip, 8500);

        listener.Start(); // 開始監聽
        Console.WriteLine("Start Listening ...");

        // 同步阻塞,等待客戶端連線
        TcpClient remoteClient = listener.AcceptTcpClient();
        Console.WriteLine("Client Connected!{0} <-- {1}",
            remoteClient.Client.LocalEndPoint, remoteClient.Client.RemoteEndPoint);

        // 取得流並讀取資料
        NetworkStream streamToClient = remoteClient.GetStream();
        byte[] buffer = new byte[BufferSize];
        int bytesRead = streamToClient.Read(buffer, 0, BufferSize);
        Console.WriteLine("Reading data, {0} bytes ...", bytesRead);

        // 依實際讀取長度解碼字串
        string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
        Console.WriteLine("Received: {0}", msg);

        // 按 Q 退出
    }
}

關鍵點:AcceptTcpClient() 會阻塞直到有客戶端連線;Read() 同樣阻塞直到有資料到達。這就是同步模式的特徵——簡單直觀,但無法同時處理多個客戶端。

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