基于C#的Socket通信TCP和UDP两种协议实现

2025-12-15

基于C#实现的Socket通信完整示例源码,包含TCP和UDP两种协议实现


一、TCP通信示例

1. TCP服务端(同步版)

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

public class TcpServer
{
    private Socket _serverSocket;
    private Socket _clientSocket;
    private byte[] _buffer = new byte[1024];

    public void Start(string ipAddress, int port)
    {
        _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _serverSocket.Bind(new IPEndPoint(IPAddress.Parse(ipAddress), port));
        _serverSocket.Listen(10);
        Console.WriteLine($"服务器启动,监听 {ipAddress}:{port}");

        _clientSocket = _serverSocket.Accept();
        Console.WriteLine("客户端已连接");

        // 接收数据线程
        Thread receiveThread = new Thread(ReceiveData);
        receiveThread.Start();
    }

    private void ReceiveData()
    {
        try
        {
            while (true)
            {
                int bytesReceived = _clientSocket.Receive(_buffer);
                string message = Encoding.UTF8.GetString(_buffer, 0, bytesReceived);
                Console.WriteLine($"收到消息: {message}");

                // 回显消息
                byte[] response = Encoding.UTF8.GetBytes($"ECHO: {message}");
                _clientSocket.Send(response);
            }
        }
        catch (SocketException ex)
        {
            Console.WriteLine($"Socket异常: {ex.Message}");
        }
    }

    public void Stop()
    {
        _clientSocket.Shutdown(SocketShutdown.Both);
        _clientSocket.Close();
        _serverSocket.Close();
    }
}

2. TCP客户端(同步版)

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

public class TcpClientDemo
{
    private Socket _clientSocket;
    private byte[] _buffer = new byte[1024];

    public void Connect(string serverIp, int port)
    {
        _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
        _clientSocket.Connect(new IPEndPoint(IPAddress.Parse(serverIp), port));
        Console.WriteLine("已连接到服务器");
    }

    public void SendMessage(string message)
    {
        byte[] data = Encoding.UTF8.GetBytes(message);
        _clientSocket.Send(data);
        
        // 接收回显
        int bytesReceived = _clientSocket.Receive(_buffer);
        string response = Encoding.UTF8.GetString(_buffer, 0, bytesReceived);
        Console.WriteLine($"服务器响应: {response}");
    }

    public void Disconnect()
    {
        _clientSocket.Shutdown(SocketShutdown.Both);
        _clientSocket.Close();
    }
}

二、UDP通信示例

1. UDP服务端

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

public class UdpServer
{
    private UdpClient _udpServer;

    public void Start(int port)
    {
        _udpServer = new UdpClient(port);
        Console.WriteLine($"UDP服务器启动,监听端口 {port}");

        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Any, 0);
        byte[] receiveBytes = _udpServer.Receive(ref remoteEP);
        string message = Encoding.UTF8.GetString(receiveBytes);
        Console.WriteLine($"收到来自 {remoteEP} 的消息: {message}");

        // 回显消息
        byte[] response = Encoding.UTF8.GetBytes($"ECHO: {message}");
        _udpServer.Send(response, response.Length, remoteEP);
    }

    public void Stop()
    {
        _udpServer.Close();
    }
}

2. UDP客户端

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

public class UdpClientDemo
{
    private UdpClient _udpClient;

    public void Send(string serverIp, int port, string message)
    {
        _udpClient = new UdpClient();
        IPEndPoint remoteEP = new IPEndPoint(IPAddress.Parse(serverIp), port);
        byte[] data = Encoding.UTF8.GetBytes(message);
        _udpClient.Send(data, data.Length, remoteEP);

        // 接收回显
        IPEndPoint receiveEP = new IPEndPoint(IPAddress.Any, 0);
        byte[] receiveBytes = _udpClient.Receive(ref receiveEP);
        string response = Encoding.UTF8.GetString(receiveBytes);
        Console.WriteLine($"服务器响应: {response}");

        _udpClient.Close();
    }
}

三、使用示例

1. TCP通信测试

// 服务端启动
var tcpServer = new TcpServer();
tcpServer.Start("127.0.0.1", 8888);

// 客户端连接
var tcpClient = new TcpClientDemo();
tcpClient.Connect("127.0.0.1", 8888);
tcpClient.SendMessage("Hello Server!");
tcpClient.Disconnect();

2. UDP通信测试

// 服务端启动
var udpServer = new UdpServer();
udpServer.Start(9999);

// 客户端发送
var udpClient = new UdpClientDemo();
udpClient.Send("127.0.0.1", 9999, "Hello UDP Server!");
udpServer.Stop();

四、关键功能说明

  1. TCP协议特性 面向连接,保证数据可靠性 支持双向持续通信 需要处理粘包/分包问题(示例未实现)

  2. UDP协议特性 无连接,不保证可靠性 低延迟,适合实时通信 需自行处理数据完整性

  3. 异常处理建议

    try
    {
        // 网络操作
    }
    catch (SocketException ex)
    {
        Console.WriteLine($"Socket错误: {ex.SocketErrorCode} - {ex.Message}");
    }
    catch (ObjectDisposedException)
    {
        Console.WriteLine("套接字已关闭");
    }
    

五、工程实践建议

  1. 多线程处理

    // 使用异步方法提升性能
    public async Task ReceiveAsync()
    {
        while (true)
        {
            SocketAsyncEventArgs e = new SocketAsyncEventArgs();
            e.SetBuffer(_buffer, 0, _buffer.Length);
            e.Completed += OnReceiveCompleted;
            await _clientSocket.ReceiveAsync(e);
        }
    }
    
  2. 心跳机制

    // 定时发送心跳包
    Timer heartbeatTimer = new Timer(30000);
    heartbeatTimer.Elapsed += (s, e) => 
    {
        byte[] heartbeat = Encoding.UTF8.GetBytes("HEARTBEAT");
        _clientSocket.Send(heartbeat);
    };
    
  3. 消息边界处理

    // 使用固定长度头部
    public void SendWithHeader(string message)
    {
        byte[] data = Encoding.UTF8.GetBytes(message);
        byte[] header = BitConverter.GetBytes(data.Length);
        _clientSocket.Send(header.Concat(data).ToArray());
    }
    

六、调试技巧

  1. 数据监控

    // 使用Wireshark抓包分析
    // 或添加日志记录
    public static class Logger
    {
        public static void Log(byte[] data)
        {
            File.WriteAllBytes("debug.bin", data);
        }
    }
    
  2. 性能测试

    // 压力测试代码
    for (int i = 0; i < 1000; i++)
    {
        var client = new TcpClientDemo();
        client.Connect("127.0.0.1", 8888);
        client.SendMessage($"Test {i}");
        client.Disconnect();
    }
    

参考代码 C# Socket通信示例源码 www.youwenfan.com/contenttef/93545.html

七、扩展功能实现

  1. SSL加密通信

    using System.Net.Security;
    using System.Security.Authentication;
    
    public class SecureTcpServer
    {
        private SslStream _sslStream;
    
        public void StartSecure(int port)
        {
            // 加载证书
            X509Certificate2 serverCert = new X509Certificate2("server.pfx", "password");
    
            TcpListener listener = new TcpListener(IPAddress.Any, port);
            listener.Start();
            TcpClient client = listener.AcceptTcpClient();
    
            _sslStream = new SslStream(client.GetStream(), false);
            _sslStream.AuthenticateAsServer(serverCert);
        }
    }
    
  2. 协议扩展

    public enum MessageType : byte
    {
        Text = 0x01,
        File = 0x02,
        Command = 0x03
    }
    
    public class ProtocolParser
    {
        public static (MessageType type, string content) Parse(byte[] data)
        {
            MessageType type = (MessageType)data[0];
            string content = Encoding.UTF8.GetString(data.Skip(1).ToArray());
            return (type, content);
        }
    }