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

C# 同步網路傳輸字串實作 (3/3):伺服器單一連線單一請求與多請求演進

     編輯:關於C語言

初版:單一連線、單一請求


// Server
TcpClient client = listener.AcceptTcpClient();
NetworkStream stream = client.GetStream();
byte[] buffer = new byte[BufferSize];
int bytesRead = stream.Read(buffer, 0, BufferSize);
string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
Console.WriteLine("Received: {0}", msg);
// 程式結束,無法再處理任何事

問題

  • 若再開一個客戶端,OS 層連線建立成功 (ESTABLISHED),但伺服器程式已結束,無法處理。
  • 同一客戶端欲發第二次請求,伺服器已無 Read 邏輯。

演進:引入 do/while 迴圈

將 Read 包在迴圈中,即可處理同一連線的多次請求 (模式三);將 Accept 也包在迴圈中,可處理多連線 (模式二)。

模式四完整架構 (需多執行緒)


// 主執行緒
while (true) {
    TcpClient client = listener.AcceptTcpClient();
    // 立即派發給新執行緒處理該連線
    ThreadPool.QueueUserWorkItem(_ => HandleClient(client));
}

void HandleClient(TcpClient client) {
    NetworkStream stream = client.GetStream();
    while (true) {
        byte[] buffer = new byte[BufferSize];
        int bytesRead = stream.Read(buffer, 0, BufferSize);
        if (bytesRead == 0) break; // 連線關閉
        string msg = Encoding.Unicode.GetString(buffer, 0, bytesRead);
        Console.WriteLine("Received: {0}", msg);
        // 處理邏輯、回應...
    }
}

本階段小結

同步阻塞模型理解為基礎,下階段將導入 非同步 Socket (APM/BeginAccept/BeginReceive) 與 Task-based Async (TAP) 實現高擴展性伺服器。

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