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

Socket 網路程式設計學習筆記 (2):TCP Socket 基礎通訊實作

     編輯:關於.NET

前言

承接上篇常用網路類別,本篇實作面向連接的 TCP Socket 通訊,含完整伺服端監聽與客戶端連接程式碼,可直接下載執行。

伺服端:Socket 監聽模式

五步驟建立監聽

  1. 建立 IPEndPoint:new IPEndPoint(IPAddress.Any, 6001) (Any 表示所有本機 IP)
  2. 建立 Socket:new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
  3. 綁定:socket.Bind(ipep)
  4. 監聽:socket.Listen(10) (backlog=10)
  5. 接受連接迴圈:

while (true)
{
    try
    {
        Socket clientSocket = serverSocket.Accept();  // 阻塞等待
        Thread clientThread = new Thread(ReceiveData);
        clientThread.Start(clientSocket);  // 傳遞 clientSocket 給執行緒
    }
    catch (Exception ex) { /* 錯誤處理 */ }
}

收發資料實作 (ReceiveData)


private void ReceiveData(object state)
{
    Socket client = (Socket)state;
    byte[] buffer = new byte[1024];
    
    // 取得客戶端端點資訊
    IPEndPoint clientEP = (IPEndPoint)client.RemoteEndPoint;
    Console.WriteLine($"Client connected: {clientEP.Address}:{clientEP.Port}");
    
    // 發送歡迎訊息
    string welcome = "Welcome to server";
    byte[] data = Encoding.ASCII.GetBytes(welcome);
    client.Send(data, data.Length, SocketFlags.None);
    
    // 接收迴圈
    while (true)
    {
        try
        {
            int available = client.Available;  // 可讀位元組數
            if (available == 0) continue;
            
            int read = client.Receive(buffer, 0, available, SocketFlags.None);
            if (read == 0) break;
            
            string msg = Encoding.ASCII.GetString(buffer, 0, read);
            Console.WriteLine($"[{clientEP}] {msg}");
        }
        catch { break; }
    }
}

客戶端:Socket 連接模式

三步驟連接

  1. 建立端點與 Socket:new IPEndPoint(IPAddress.Parse("127.0.0.1"), 6001) + new Socket(...)
  2. 連接:clientSocket.Connect(ipep) (需伺服端已啟動監聽)
  3. 收發迴圈:

// 接收迴圈
while (true)
{
    int available = clientSocket.Available;
    if (available > 0)
    {
        byte[] buffer = new byte[1024];
        int read = clientSocket.Receive(buffer, 0, available, SocketFlags.None);
        string msg = Encoding.ASCII.GetString(buffer, 0, read);
        Console.WriteLine($"Server: {msg}");
    }
}

// 發送 (UI 事件中)
byte[] data = Encoding.ASCII.GetBytes(textBox.Text);
clientSocket.Send(data, data.Length, SocketFlags.None);

關鍵技術點

技術點說明
IPAddress.Any監聽所有本機網卡 IP,不需逐一指定
ProtocolType.Tcp指定 TCP 協定 (面向連接、可靠、有序)
Listen(backlog)待連接佇列長度,超過則拒絕新連接
Accept()阻塞直到有連接,回傳新 Socket 專責該連接
多執行緒每連接一執行緒,主執行緒持續 Accept
Encoding.ASCII字串 ↔ 位元組轉換,網路傳輸必須是位元組
RemoteEndPoint取得對方 IP:Port,型別轉換為 IPEndPoint
Available取得接收緩衝區可立即讀取的位元組數

執行畫面

  • 伺服端視窗:顯示連接客戶端 IP:Port、收到訊息
  • 客戶端視窗:輸入發送文字、顯示伺服端回應
  • 原始碼含 WinForms 介面完整專案

延伸方向

  • 非同步 Socket:BeginAccept/EndAccept、BeginReceive/EndReceive,避免執行緒佔用
  • 執行緒池:下一篇將介紹 ThreadPool.QueueUserWorkItem 替代手動建立執行緒
  • 訊息邊界:Available 非可靠邊界判斷,需協定層處理 (下下篇)

原始碼下載

本文配套原始碼

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