.NET Framework 提供 System.Net(高層協議操作)與 System.Net.Sockets(低層 Socket/TCP/UDP 操作)兩大命名空間支援網路程式開發。Socket 類別是 Winsock API 的託管實作,為 TcpClient、TcpListener、UdpClient 等高層類別的基礎。本文詳細說明 Socket 核心概念、關鍵類別、同步/非同步模式與完整 Client/Server 範例。
Socket 可視為應用程式與遠端伺服器間的資料通道。建立 Socket 實例後,透過 Send/SendTo 傳送資料,Receive/ReceiveFrom 接收資料。
// TCP Socket
Socket tcpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// UDP Socket
Socket udpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
參數說明:
AddressFamily.InterNetwork:IPv4 定址SocketType.Stream:串流/連線導向(TCP)SocketType.Dgram:資料報/無連線(UDP)| 類別/方法 | 用途 |
|---|---|
IPEndPoint | IP 位址與埠號組合的網路端點 |
IPAddress.Parse() | 字串轉 IPAddress 實例 |
Dns.Resolve() | 網域名稱解析為 IP 位址 |
Socket.Bind() | 伺服器端綁定本地端點 |
Socket.Listen() | 開始監聽連線請求 |
Socket.Accept() | 接受連線,回傳新 Socket 處理通訊 |
Socket.Connect() | 客戶端主動連線 |
Socket.Shutdown() / Close() | 關閉連線與釋放資源 |
SocketException:作業系統層級網路錯誤ArgumentNullException:參數為 nullObjectDisposedException:Socket 已關閉Send、Receive 等待操作完成才返回,適合簡單應用。BeginSend、BeginReceive 立即返回,配合回呼函數處理完成事件,適合高併發伺服器。using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketClient
{
class Program
{
static void Main()
{
try
{
int port = 2000;
string host = "127.0.0.1";
IPAddress ip = IPAddress.Parse(host);
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
client.Connect(ipe);
string sendStr = "hello! This is a socket test";
byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
client.Send(sendBytes, sendBytes.Length, 0);
byte[] recvBytes = new byte[1024];
int bytes = client.Receive(recvBytes, recvBytes.Length, 0);
string recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("Server 回應: " + recvStr);
client.Close();
}
catch (Exception ex) { Console.WriteLine(ex.Message); }
Console.ReadLine();
}
}
}
using System;
using System.Text;
using System.Net;
using System.Net.Sockets;
namespace SocketServer
{
class Program
{
static void Main()
{
try
{
int port = 2000;
IPAddress ip = IPAddress.Parse("127.0.0.1");
IPEndPoint ipe = new IPEndPoint(ip, port);
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(ipe);
server.Listen(0);
Console.WriteLine("伺服器啟動,等待連線...");
Socket client = server.Accept();
Console.WriteLine("客戶端已連線");
byte[] recvBytes = new byte[1024];
int bytes = client.Receive(recvBytes, recvBytes.Length, 0);
string recvStr = Encoding.ASCII.GetString(recvBytes, 0, bytes);
Console.WriteLine("收到訊息: " + recvStr);
string sendStr = "OK! Success!";
byte[] sendBytes = Encoding.ASCII.GetBytes(sendStr);
client.Send(sendBytes, sendBytes.Length, 0);
client.Shutdown(SocketShutdown.Both);
client.Close();
server.Shutdown(SocketShutdown.Both);
server.Close();
}
catch (Exception ex) { Console.WriteLine(ex.Message); }
Console.ReadLine();
}
}
}
先啟動 Server 再執行 Client,即可觀察雙向通訊流程。此範例在 Visual Studio 2005 Express / .NET 2.0 環境測試通過。