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

C# Socket 網絡編程快速入門:從原理到 TCP/UDP 完整示例

     編輯:關於C#

.NET 提供 System.Net.Sockets 命名空間封裝 Berkeley Socket API,支援同步/異步、TCP/UDP 通訊。本文從原理講起,提供完整 Client/Server 代碼。

Socket 通訊原理 (C/S 模式)

  • 服務端:socket() → bind() → listen() → accept() (阻塞等待) → 收發數據 → close()。accept() 返回新 socket 處理該連接,主 socket 繼續監聽。
  • 客戶端:socket() → connect() → 收發數據 → close()。

核心類

  • Socket:底層通用類,支援 TCP/UDP、同步/異步。
  • TcpListener / TcpClient:TCP 高層封裝,簡化監聽/連接。
  • UdpClient:UDP 封裝。
  • NetworkStream:基於流的讀寫 (僅 TCP)。
  • IPEndPoint:IP + Port 終結點。

創建 Socket

// TCP
Socket tcpSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
// UDP
Socket udpSock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

完整同步 TCP 示例

Client

using System; using System.Text; using System.Net; using System.Net.Sockets;

class Client {
    static void Main() {
        try {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint ep = new IPEndPoint(ip, 2000);
            Socket c = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            Console.WriteLine("Connecting...");
            c.Connect(ep);

            string msg = "hello!This is a socket test";
            byte[] bs = Encoding.ASCII.GetBytes(msg);
            c.Send(bs, bs.Length, 0);

            byte[] recv = new byte[1024];
            int n = c.Receive(recv, recv.Length, 0);
            Console.WriteLine("Server Reply: " + Encoding.ASCII.GetString(recv, 0, n));

            c.Close();
        } catch (Exception ex) { Console.WriteLine(ex); }
        Console.ReadLine();
    }
}

Server

using System; using System.Text; using System.Net; using System.Net.Sockets;

class Server {
    static void Main() {
        try {
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint ep = new IPEndPoint(ip, 2000);
            Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            s.Bind(ep);
            s.Listen(0);
            Console.WriteLine("Waiting for connect...");

            Socket client = s.Accept(); // 阻塞
            Console.WriteLine("Connected!");

            byte[] recv = new byte[1024];
            int n = client.Receive(recv, recv.Length, 0);
            Console.WriteLine("Received: " + Encoding.ASCII.GetString(recv, 0, n));

            string reply = "Ok! Client Send Message Successful!";
            byte[] bs = Encoding.ASCII.GetBytes(reply);
            client.Send(bs, bs.Length, 0);

            client.Close(); s.Close();
        } catch (Exception ex) { Console.WriteLine(ex); }
        Console.ReadLine();
    }
}

高層封裝:TcpClient / TcpListener + NetworkStream

// Client
TcpClient tcp = new TcpClient("127.0.0.1", 2000);
NetworkStream ns = tcp.GetStream();
// ns.Read/Write ...

// Server
TcpListener listener = new TcpListener(IPAddress.Any, 2000);
listener.Start();
TcpClient client = listener.AcceptTcpClient();
NetworkStream ns = client.GetStream();
// ns.Read/Write ...

進階:廣播式聊天室雛形

  • 客戶端:UI (ListBox, TextBox, Buttons) + 接收執行緒 (循環 Receive 更新 UI,需 Invoke 跨執行緒)。
  • 服務端:維護客戶端 List<Socket>,收到消息廣播給所有其他客戶端。
  • 編碼:發送 UTF8,接收解碼 GB2312 (或統一 UTF8) 避免中文亂碼。
  • 斷開協議:客戶端關閉發送特定指令 (如 CLOSE|IP|Nick),服務端識別移除。

Socket 編程核心在於理解連接建立、數據幀處理、同步阻塞與異步非阻塞模型。實戰中建議優先使用 TcpClient/Listener + NetworkStream 或現代 System.Net.WebSockets、SignalR 等高層框架。

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