Socket 通訊基礎流程
伺服器端
new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
Bind(new IPEndPoint(IPAddress.Any, port))
Listen(backlog)
Accept() 回傳新 Socket 處理該客戶端
- 收發:
Receive/Send
客戶端
new Socket(...)
Connect(serverEP)
- 收發:
Send/Receive
完整同步 TCP 範例
伺服器
var listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listener.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000));
listener.Listen(10);
Console.WriteLine("等待連線...");
var client = listener.Accept();
var buffer = new byte[1024];
int len = client.Receive(buffer);
Console.WriteLine("收到: " + Encoding.ASCII.GetString(buffer, 0, len));
client.Send(Encoding.ASCII.GetBytes("OK"));
client.Close();
listener.Close();
客戶端
var client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000));
client.Send(Encoding.ASCII.GetBytes("Hello Server"));
var buffer = new byte[1024];
int len = client.Receive(buffer);
Console.WriteLine("回應: " + Encoding.ASCII.GetString(buffer, 0, len));
client.Close();
高階類別:TcpListener / TcpClient / NetworkStream
// 伺服器
var listener = new TcpListener(IPAddress.Any, 2000);
listener.Start();
var tcpClient = listener.AcceptTcpClient();
var stream = tcpClient.GetStream();
// stream.Read / stream.Write
// 客戶端
var tcpClient = new TcpClient("127.0.0.1", 2000);
var stream = tcpClient.GetStream();
NetworkStream 繼承 Stream,可搭配 StreamReader/Writer、BinaryReader/Writer。
- UDP 使用
UdpClient,無連線、不可靠、適合廣播/即時傳輸。
同步 vs 非同步
- 同步:
Send/Receive/Accept 封鎖執行緒,簡單但延展性差。
- 非同步 (APM):
BeginSend/EndSend、BeginReceive/EndReceive,.NET 2.0 主流模式。
- 現代 (TAP):.NET 4.5+
SendAsync/ReceiveAsync 配合 async/await,強烈建議新專案使用。
廣播式聊天室架構草圖
- 伺服器維護
List<TcpClient> 或 Dictionary<string, TcpClient>。
- 每個客戶端連線啟動專屬接收執行緒(或非同步回調)。
- 收到訊息 → 解碼(UTF-8 → 字串) → 廣播給其他所有客戶端。
- 編碼陷阱:傳送端
Encoding.UTF8.GetBytes,接收端 Encoding.UTF8.GetString,避免中文亂碼。
- 跨執行緒更新 UI:
Control.Invoke 或 SynchronizationContext.Post。
- 優雅斷線:客戶端關閉視窗時發送特定指令(如
"__QUIT__|username"),伺服器移除清單並關閉對應 Socket。
關鍵命名空間
System.Net:IPAddress、IPEndPoint、Dns
System.Net.Sockets:Socket、TcpListener、TcpClient、UdpClient、NetworkStream