// 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);
// 程式結束,無法再處理任何事
將 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) 實現高擴展性伺服器。