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

C# 同步網路傳輸字串實作 (4/4):伺服器處理多用戶端單一請求與多請求邏輯

     編輯:關於C語言

四種伺服器處理模式比較

模式Accept 迴圈Read 迴圈能力
1無無單一用戶端、單一請求
2有有 (同層)多用戶端、各一請求 (循序處理)
3無有單一用戶端、多請求
4巢狀雙層內層多用戶端、多請求 (需多執行緒)

模式二:多用戶端、各一請求

do {
    TcpClient client = listener.AcceptTcpClient();
    Console.WriteLine("Client Connected! ...");
    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);
} while (true);

模式三:單一用戶端、多請求


TcpClient client = listener.AcceptTcpClient(); // 單次 Accept
NetworkStream stream = client.GetStream();
do {
    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);
} while (true);

模式四:多用戶端、多請求 (需多執行緒)

外層 Accept 迴圈在主執行緒,內層 Read 迴圈必須委派給新執行緒 (或 ThreadPool/Task),否則主執行緒卡在內層 Read 無法接受新連線。這是生產級伺服器的基本架構。

客戶端修改:支援多次發送


NetworkStream stream = client.GetStream();
ConsoleKey key;
Console.WriteLine("Menu: S - Send, X - Exit");
do {
    key = Console.ReadKey(true).Key;
    if (key == ConsoleKey.S) {
        Console.Write("Input the message: ");
        string msg = Console.ReadLine();
        byte[] buffer = Encoding.Unicode.GetBytes(msg);
        stream.Write(buffer, 0, buffer.Length);
        Console.WriteLine("Sent: {0}", msg);
    }
} while (key != ConsoleKey.X);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved