首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 網路程式設計:TcpClient、TcpListener 與 NetworkStream 完整攻略

     編輯:關於C#

TCP 協議在 .NET 的分層架構

.NET 將網路 API 分為三層:

  1. 傳輸層:Socket 類別,最底層、最靈活、最複雜。
  2. 應用協議層:TcpClient、TcpListener、UdpClient,封裝 Socket 連線細節,提供高階抽象。
  3. 請求回應層:HttpWebRequest、FtpWebRequest 等,針對特定應用層協議。

本文專注於應用協議層的 TCP 程式設計。

TcpClient - 用戶端連線

三種建構函式

建構函式用途
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);

NetworkStream - 網路資料流

TcpClient.GetStream() 回傳 NetworkStream,繼承自 Stream,支援標準 Read/Write、BeginRead/BeginWrite 等同步/非同步操作。

特性

  • ✅ 循序存取,不支援 Seek、Position(CanSeek=false)
  • ✅ 即時處理:資料到達即可讀取,無需等待完整下載
  • ✅ 統一介面:檔案、記憶體、網路皆用 Stream 操作

取得 NetworkStream 兩種方式

// 方式 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);

TcpListener - 伺服器端監聽

建構與啟動

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();
    }
}

以此為基礎,可延伸開發聊天室、檔案傳輸、遠端指令等應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved