.NET System.Net.Sockets 命名空間提供 Socket、TcpClient/TcpListener、UdpClient、NetworkStream 等類別。本文從基礎 Socket 流程切入,完整實作 TCP 同步通訊、多執行緒廣播式聊天室、檔案傳輸 (FTP) 三大範例。
Socket → Bind → Listen → Accept → Receive/Send → CloseSocket → Connect → Send/Receive → CloseIPAddress.Parse("127.0.0.1") 解析 IP。Send/Receive 封鎖直到完成,適合教學與簡單應用。
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
c.Connect(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000));
byte[] bs = Encoding.ASCII.GetBytes("hello! socket test");
c.Send(bs);
byte[] recv = new byte[1024];
int n = c.Receive(recv);
Console.WriteLine("Server: " + Encoding.ASCII.GetString(recv, 0, n));
c.Close();
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 2000));
s.Listen(0);
Socket client = s.Accept();
byte[] recv = new byte[1024];
int n = client.Receive(recv);
Console.WriteLine("Client: " + Encoding.ASCII.GetString(recv, 0, n));
client.Send(Encoding.ASCII.GetBytes("OK!"));
client.Close(); s.Close();
// Client
TcpClient tcp = new TcpClient("127.0.0.1", 2000);
NetworkStream ns = tcp.GetStream();
// ns.Read/Write 或 StreamReader/StreamWriter
// Server
TcpListener listener = new TcpListener(2000);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
UdpClient:無連線、無 GetStream、直接 Send/Receive,適合廣播、即時性要求高、可容忍丟包場景。
while(true) ReadLine)、UTF-8 編碼傳輸、Control.Invoke 跨執行緒更新 ListBox。AcceptSocket) + 廣播執行緒 (foreach client Send)、ArrayList 管理連線、FormClosing 發送 "Close" 通知 Server 移除。Encoding.UTF8.GetBytes,接收後 Encoding.Convert(UTF8, GB2312) 顯示中文。完整程式碼包含 Form1.Designer.cs、Form1.cs (Client/Server)、Form2.cs (連線對話框),篇幅較大,核心邏輯如上。
CMD|參數|參數...\r\n (如 LIST, DOWNLOAD|filename, UPLOAD|filename|size)。| 主題 | 要點 |
|---|---|
| 編碼 | 網路傳輸統一 UTF-8,顯示端轉目標編碼 (GB2312/Big5/UTF-8) |
| 跨執行緒 UI | WinForms 用 Invoke/BeginInvoke,WPF 用 Dispatcher.Invoke |
| 連線管理 | Server 維護連線集合,Client 斷線時通知 Server 移除 |
| 協定設計 | 命令|長度|內容 結構化,避免粘包/拆包問題 |
| 異步改良 | .NET 4.5+ 用 SendAsync/ReceiveAsync + await 取代阻塞執行緒 |
Socket 程式設計是網路應用基石。同步阻塞模式易理解、除錯,適合教學與低併發場景;高併發生產環境請採用 SocketAsyncEventArgs、Task、Kestrel 等非同步高效能模型。本文三大範例涵蓋點對點通訊、多點廣播、檔案傳輸核心模式,配合編碼處理、執行緒同步、協定設計等實戰細節,可作為網路程式開發的參考藍圖。