繼續 Socket 系列,本篇實作 TCP 伺服器:綁定端點、監聽、接受連線、迴圈收發資料。附帶無連線套接字時序圖輔助理解。

Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, 9050));
server.Listen(10);
Console.WriteLine("waiting for a client");
Socket client = server.Accept();
IPEndPoint clientIp = (IPEndPoint)client.RemoteEndPoint;
Console.WriteLine($"connect with client: {clientIp.Address}:{clientIp.Port}");
client.Send(Encoding.ASCII.GetBytes("welcome here!"));
byte[] data = new byte[1024];
while (true) {
data = new byte[1024];
int recv = client.Receive(data);
if (recv == 0) break; // 客戶端斷開
Console.WriteLine(Encoding.ASCII.GetString(data, 0, recv));
client.Send(data, recv, SocketFlags.None); // 回應
}
client.Close(); server.Close();
注意:Accept 回傳新 Socket 專責該客戶端通訊,主 Socket 可繼續監聽新連線。實務上通常啟動新執行緒或使用非同步模式處理多客戶端。