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

C# Socket 客戶端實作:TCP 連線、收發訊息、資源釋放

     編輯:關於C#

專案建立與 UI 佈局

WinForms 專案 SocketClient,表單放置:

  • GroupBox「發送訊息」:Label、TextBox txtMsg、Button btnSend
  • GroupBox「伺服器回饋」:ListBox lbInfo

命名空間與欄位

using System.IO;
using System.Net;
using System.Net.Sockets;

public partial class Form1 : Form {
    private Socket _socket;
    private NetworkStream _ns;
    private StreamReader _sr;
    private StreamWriter _sw;
    // ...
}

發送按鈕:連線、傳送、接收回應

private void btnSend_Click(object sender, EventArgs e) {
    try {
        // 1. 建立 TCP Socket
        _socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        IPAddress serverIP = IPAddress.Parse("222.18.142.171"); // 伺服器 IP
        int port = 13; // Daytime 協定埠,實際依伺服器而定

        // 2. 連線
        _socket.Connect(serverIP, port);

        // 3. 包裝 NetworkStream + 讀寫器
        _ns = new NetworkStream(_socket);
        _sr = new StreamReader(_ns);
        _sw = new StreamWriter(_ns) { AutoFlush = true }; // 自動 Flush

        // 4. 發送訊息
        _sw.WriteLine(txtMsg.Text);

        // 5. 讀取回應(單行)
        string response = _sr.ReadLine();
        lbInfo.Items.Add($"Server: {response}");
    }
    catch (Exception ex) {
        MessageBox.Show($"Error: {ex.Message}");
    }
}

表單關閉:正確釋放資源


private void Form1_FormClosed(object sender, FormClosedEventArgs e) {
    try {
        if (_socket != null && _socket.Connected) {
            _socket.Shutdown(SocketShutdown.Both); // 禁用收發
        }
    }
    finally {
        _sr?.Dispose();
        _sw?.Dispose();
        _ns?.Dispose();
        _socket?.Close(); // 釋放非受控資源
        _socket?.Dispose();
    }
}

關鍵點補充

  • 同步阻塞:Connect、ReadLine 會阻塞 UI 執行緒,實務上應用 async/await 或 BeginConnect/EndConnect 非同步模式。
  • 訊息邊界:TCP 為串流協定,ReadLine 假設以換行符分隔。自訂協定需自行處理黏包/拆包(長度前綴、分隔符、固定長度)。
  • 編碼:StreamReader/Writer 預設 UTF-8,雙方需一致。
  • 例外處理:網路操作易發生 SocketException、IOException、ObjectDisposedException,需分別捕獲。
  • 伺服器端:需對應 TcpListener、AcceptSocket、讀寫迴圈,支援多客戶端可用 ThreadPool 或 async。

現代化改寫建議 (.NET Core / 5+)


// 使用 System.Net.Sockets + async/await
using var client = new TcpClient();
await client.ConnectAsync("222.18.142.171", 13);
using var stream = client.GetStream();
using var writer = new StreamWriter(stream) { AutoFlush = true };
using var reader = new StreamReader(stream);

await writer.WriteLineAsync(txtMsg.Text);
string response = await reader.ReadLineAsync();
lbInfo.Items.Add($"Server: {response}");
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved