.NET 提供 System.Net.Sockets 命名空間封裝 Berkeley Socket API,支援同步/異步、TCP/UDP 通訊。本文從原理講起,提供完整 Client/Server 代碼。
socket() → bind() → listen() → accept() (阻塞等待) → 收發數據 → close()。accept() 返回新 socket 處理該連接,主 socket 繼續監聽。socket() → connect() → 收發數據 → close()。Socket:底層通用類,支援 TCP/UDP、同步/異步。TcpListener / TcpClient:TCP 高層封裝,簡化監聽/連接。UdpClient:UDP 封裝。NetworkStream:基於流的讀寫 (僅 TCP)。IPEndPoint:IP + Port 終結點。// TCP
Socket tcpSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// UDP
Socket udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
using System; using System.Text; using System.Net; using System.Net.Sockets;
class Client {
static void Main() {
try {
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ep = new IPEndPoint(ip, 2000);
Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
Console.WriteLine("Connecting...");
c.Connect(ep);
string msg = "hello!This is a socket test";
byte[] bs = Encoding.ASCII.GetBytes(msg);
c.Send(bs, bs.Length, 0);
byte[] recv = new byte[1024];
int n = c.Receive(recv, recv.Length, 0);
Console.WriteLine("Server Reply: " + Encoding.ASCII.GetString(recv, 0, n));
c.Close();
} catch (Exception ex) { Console.WriteLine(ex); }
Console.ReadLine();
}
}
using System; using System.Text; using System.Net; using System.Net.Sockets;
class Server {
static void Main() {
try {
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ep = new IPEndPoint(ip, 2000);
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(ep);
s.Listen(0);
Console.WriteLine("Waiting for connect...");
Socket client = s.Accept(); // 阻塞
Console.WriteLine("Connected!");
byte[] recv = new byte[1024];
int n = client.Receive(recv, recv.Length, 0);
Console.WriteLine("Received: " + Encoding.ASCII.GetString(recv, 0, n));
string reply = "Ok! Client Send Message Successful!";
byte[] bs = Encoding.ASCII.GetBytes(reply);
client.Send(bs, bs.Length, 0);
client.Close(); s.Close();
} catch (Exception ex) { Console.WriteLine(ex); }
Console.ReadLine();
}
}
// Client
TcpClient tcp = new TcpClient("127.0.0.1", 2000);
NetworkStream ns = tcp.GetStream();
// ns.Read/Write ...
// Server
TcpListener listener = new TcpListener(IPAddress.Any, 2000);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
// ns.Read/Write ...
Receive 更新 UI,需 Invoke 跨執行緒)。List<Socket>,收到消息廣播給所有其他客戶端。UTF8,接收解碼 GB2312 (或統一 UTF8) 避免中文亂碼。CLOSE|IP|Nick),服務端識別移除。Socket 編程核心在於理解連接建立、數據幀處理、同步阻塞與異步非阻塞模型。實戰中建議優先使用 TcpClient/Listener + NetworkStream 或現代 System.Net.WebSockets、SignalR 等高層框架。