基于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);
相关推荐
曹牧2 小时前
C#:主线程能够捕获到子线程中的异常
开发语言·数据库·c#
古月方枘Fry3 小时前
MGRE实验
运维·服务器
博客-小覃3 小时前
Zabbix之华为交换机的日志记录信息操作详细教程
服务器·网络·华为·zabbix
stolentime3 小时前
FreeDomain 本地开发环境快速搭建指南
运维·服务器·网络
向量引擎3 小时前
从零起步,如何打造专属向量引擎 API 中转工作流?
java·服务器·前端
z200509304 小时前
【Linux学习】Linux中的进程程序替换
linux·服务器·学习
lihao lihao6 小时前
软硬链接
linux·运维·服务器
TOWE technology6 小时前
智能安防监控系统如何做好防雷?——视频信号SPD综合应用方案解析
运维·服务器·防雷产品·信号保护·信号防雷·spd
雪度娃娃6 小时前
存储器层次结构——磁盘硬盘存储
服务器·网络·数据库·计算机组成原理
大明者省6 小时前
IIS 端口绑定正常访问的原理说明与常见误区澄清
运维·服务器·笔记