基于C#的TCP/IP通信客户端与服务器

一、TCP服务器实现(支持多客户端)

csharp 复制代码
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class TcpServer
{
    private readonly TcpListener _listener;
    private readonly int _port;

    public TcpServer(int port)
    {
        _port = port;
        _listener = new TcpListener(IPAddress.Any, port);
    }

    public async Task StartAsync()
    {
        _listener.Start();
        Console.WriteLine($"服务器已启动,监听端口 {_port}");

        while (true)
        {
            var client = await _listener.AcceptTcpClientAsync();
            _ = HandleClientAsync(client); // 异步处理客户端连接
        }
    }

    private async Task HandleClientAsync(TcpClient client)
    {
        try
        {
            Console.WriteLine($"客户端 {client.Client.RemoteEndPoint} 已连接");
            using (client)
            using (var stream = client.GetStream())
            {
                byte[] buffer = new byte[1024 * 4];
                int bytesRead;

                while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
                {
                    string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
                    Console.WriteLine($"收到消息: {message}");

                    // 回显消息
                    await stream.WriteAsync(Encoding.UTF8.GetBytes($"ECHO: {message}"));
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"客户端 {client.Client.RemoteEndPoint} 异常: {ex.Message}");
        }
    }
}

二、TCP客户端实现

csharp 复制代码
using System;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;

public class TcpClientDemo
{
    private readonly TcpClient _client;
    private readonly NetworkStream _stream;

    public TcpClientDemo(string serverIp, int port)
    {
        _client = new TcpClient();
        _client.Connect(serverIp, port);
        _stream = _client.GetStream();
    }

    public async Task SendAsync(string message)
    {
        try
        {
            byte[] data = Encoding.UTF8.GetBytes(message);
            await _stream.WriteAsync(data, 0, data.Length);
            Console.WriteLine($"已发送: {message}");

            // 接收响应
            byte[] buffer = new byte[1024 * 4];
            int bytesRead = await _stream.ReadAsync(buffer, 0, buffer.Length);
            string response = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            Console.WriteLine($"收到响应: {response}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"通信异常: {ex.Message}");
        }
    }

    public void Disconnect()
    {
        _stream.Close();
        _client.Close();
    }
}

三、使用示例

服务器启动
csharp 复制代码
var server = new TcpServer(8888);
await server.StartAsync();
客户端连接与通信
csharp 复制代码
using var client = new TcpClientDemo("127.0.0.1", 8888);
await client.SendAsync("Hello Server!");
client.Disconnect();

四、关键特性实现

1. 异步通信优化
csharp 复制代码
// 使用异步方法提升并发性能
public async Task HandleClientAsync(TcpClient client)
{
    using (client)
    using (var stream = client.GetStream())
    {
        byte[] buffer = new byte[1024 * 4];
        while (true)
        {
            int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length);
            if (bytesRead == 0) break;

            string message = Encoding.UTF8.GetString(buffer, 0, bytesRead);
            await ProcessMessageAsync(client, message);
        }
    }
}
2. 异常处理机制
csharp 复制代码
try
{
    // 通信逻辑
}
catch (SocketException ex) when (ex.SocketErrorCode == SocketError.ConnectionReset)
{
    Console.WriteLine("客户端异常断开连接");
}
catch (TimeoutException)
{
    Console.WriteLine("操作超时,请检查网络状态");
}
3. 数据帧处理(带长度前缀)
csharp 复制代码
// 发送带长度前缀的数据
byte[] message = Encoding.UTF8.GetBytes("Hello");
byte[] lengthPrefix = BitConverter.GetBytes(IPAddress.HostToNetworkOrder(message.Length));
await stream.WriteAsync(lengthPrefix, 0, lengthPrefix.Length);
await stream.WriteAsync(message, 0, message.Length);

// 接收带长度前缀的数据
byte[] lengthBytes = new byte[4];
await stream.ReadExact(lengthBytes, 0, 4);
int length = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(lengthBytes, 0));
byte[] data = new byte[length];
await stream.ReadExact(data, 0, length);

参考代码 c#平台的TCPIP通讯客户端与服务器代码 www.youwenfan.com/contentcsr/112692.html

五、性能优化

  1. 缓冲区管理

    csharp 复制代码
    // 使用内存池减少GC压力
    byte[] buffer = MemoryPool<byte>.Shared.Rent(1024 * 4);
    try
    {
        // 使用buffer进行读写操作
    }
    finally
    {
        MemoryPool<byte>.Shared.Return(buffer);
    }
  2. 连接池管理

    csharp 复制代码
    // 实现TCP连接池
    public class TcpConnectionPool
    {
        private readonly ConcurrentBag<TcpClient> _pool = new();
    
        public async Task<TcpClient> GetConnectionAsync(string ip, int port)
        {
            if (!_pool.TryTake(out var client))
            {
                client = new TcpClient();
                await client.ConnectAsync(ip, port);
            }
            return client;
        }
    }
  3. 流量控制

    csharp 复制代码
    // 使用信号量限制并发连接数
    private readonly SemaphoreSlim _semaphore = new(100);
    
    public async Task HandleClientAsync(TcpClient client)
    {
        await _semaphore.WaitAsync();
        try
        {
            // 处理逻辑
        }
        finally
        {
            _semaphore.Release();
        }
    }

六、完整项目结构

bash 复制代码
TcpCommunicationDemo/
├── Server/
│   ├── Program.cs          // 服务器启动入口
│   └── TcpServer.cs        // 服务器核心逻辑
├── Client/
│   ├── Program.cs          // 客户端启动入口
│   └── TcpClientDemo.cs    // 客户端实现
├── Models/
│   └── MessageProtocol.cs  // 自定义通信协议
└── Tests/
    └── ServerTests.cs      // 单元测试

七、调试与监控

  1. 日志记录

    csharp 复制代码
    using var logger = new FileLogger("server.log");
    logger.Log($"[{DateTime.Now}] 新连接: {client.Client.RemoteEndPoint}");
  2. 性能监控

    csharp 复制代码
    var perfCounter = new PerformanceCounter("Network Interface", "Bytes Received");
    Console.WriteLine($"当前接收速率: {perfCounter.NextValue()} bytes/sec");

八、扩展功能实现

1. 心跳检测机制
csharp 复制代码
// 客户端定时发送心跳包
private async Task SendHeartbeatAsync()
{
    while (true)
    {
        await _stream.WriteAsync(Encoding.UTF8.GetBytes("HEARTBEAT"));
        await Task.Delay(TimeSpan.FromSeconds(30));
    }
}
2. 加密通信
csharp 复制代码
// 使用TLS加密
var sslStream = new SslStream(_stream, false);
var sslClient = new SslClientAuthenticationOptions
{
    TargetHost = "server.example.com",
    EnabledSslProtocols = SslProtocols.Tls12
};
await sslStream.AuthenticateAsClientAsync(sslClient);
相关推荐
茶杯梦轩21 小时前
从零起步学习RabbitMQ || 第二章:RabbitMQ 深入理解概念 Producer、Consumer、Exchange、Queue 与企业实战案例
服务器·后端·消息队列
晨星shine2 天前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
用户298698530142 天前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
用户3667462526742 天前
接口文档汇总 - 2.设备状态管理
c#
用户3667462526742 天前
接口文档汇总 - 3.PLC通信管理
c#
blasit3 天前
笔记:Qt C++建立子线程做一个socket TCP常连接通信
c++·qt·tcp/ip
Ray Liang3 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
YuMiao3 天前
gstatic连接问题导致Google Gemini / Studio页面乱码或图标缺失问题
服务器·网络协议
Sinclair6 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
Scout-leaf6 天前
WPF新手村教程(三)—— 路由事件
c#·wpf