.NET 將網路 API 分為三層:
Socket 類別,最底層、最靈活、最複雜。TcpClient、TcpListener、UdpClient,封裝 Socket 連線細節,提供高階抽象。HttpWebRequest、FtpWebRequest 等,針對特定應用層協議。本文專注於應用協議層的 TCP 程式設計。
| 建構函式 | 用途 |
|---|---|
TcpClient() | 使用本機預設 IP 與連接埠 0,稍後需呼叫 Connect |
TcpClient(IPEndPoint localEP) | 指定本機端點(IP+Port)綁定,適合多網卡環境 |
TcpClient(string hostname, int port) | 直接連線至遠端主機,內建連線動作,最簡便 |
// 方式 1:預設建構 + 連線
var client = new TcpClient();
client.Connect("www.example.com", 80);
// 方式 2:指定本機端點再連線
var localEP = new IPEndPoint(IPAddress.Parse("192.168.1.5"), 5000);
var client2 = new TcpClient(localEP);
client2.Connect("10.0.0.1", 8080);
// 方式 3:一步到位
var client3 = new TcpClient("mail.server.com", 25);
TcpClient.GetStream() 回傳 NetworkStream,繼承自 Stream,支援標準 Read/Write、BeginRead/BeginWrite 等同步/非同步操作。
Seek、Position(CanSeek=false)Stream 操作// 方式 1:透過 TcpClient(推薦)
var client = new TcpClient("host", 80);
var stream = client.GetStream();
// 方式 2:透過 Socket 手動建立
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.Connect("host", 80);
var stream2 = new NetworkStream(socket, FileAccess.ReadWrite, false);
// 寫入
byte[] data = Encoding.ASCII.GetBytes("GET / HTTP/1.1\r\nHost: example.com\r\n\r\n");
stream.Write(data, 0, data.Length);
// 讀取
byte[] buffer = new byte[1024];
int bytesRead = stream.Read(buffer, 0, buffer.Length);
string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
var listener = new TcpListener(IPAddress.Any, 8080); // 監聽所有介面的 8080
listener.Start();
while (true)
{
// 同步阻塞等待連線
TcpClient client = listener.AcceptTcpClient();
// 或使用 AcceptSocket() 取得 Socket
// 處理連線(建議另開執行緒或使用非同步)
NetworkStream ns = client.GetStream();
// ... 讀寫資料 ...
ns.Close();
client.Close();
}
listener.Stop();
public void SendMessage()
{
var client = new TcpClient(txtIp.Text, int.Parse(txtPort.Text));
var stream = client.GetStream();
var writer = new StreamWriter(stream) { AutoFlush = true };
writer.WriteLine($"{DateTime.Now}: {txtMessage.Text}");
writer.Close();
stream.Close();
client.Close();
}
public void StartServer()
{
var listener = new TcpListener(int.Parse(txtPort.Text));
listener.Start();
while (true)
{
var client = listener.AcceptTcpClient();
var stream = client.GetStream();
var reader = new StreamReader(stream);
string msg = reader.ReadLine();
lstMessages.Items.Add(msg);
reader.Close();
stream.Close();
client.Close();
}
}
以此為基礎,可延伸開發聊天室、檔案傳輸、遠端指令等應用。