基于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);
相关推荐
安科士andxe2 小时前
深入解析|安科士1.25G CWDM SFP光模块核心技术,破解中长距离传输痛点
服务器·网络·5g
儒雅的晴天6 小时前
大模型幻觉问题
运维·服务器
通信大师7 小时前
深度解析PCC策略计费控制:核心网产品与应用价值
运维·服务器·网络·5g
默|笙9 小时前
【Linux】fd_重定向本质
linux·运维·服务器
游乐码9 小时前
c#变长关键字和参数默认值
学习·c#
叫我龙翔9 小时前
【计网】从零开始掌握序列化 --- JSON实现协议 + 设计 传输\会话\应用 三层结构
服务器·网络·c++·json
全栈小59 小时前
【C#】合理使用DeepSeek相关AI应用为我们提供强有力的开发工具,在.net core 6.0框架下使用JsonNode动态解析json字符串,如何正确使用单问号和双问号做好空值处理
人工智能·c#·json·.netcore·deepseek
“αβ”9 小时前
网络层协议 -- ICMP协议
linux·服务器·网络·网络协议·icmp·traceroute·ping
范纹杉想快点毕业10 小时前
C语言课后大作业项目实战,微型数据库,文件操作详解从基础到实战
服务器·数据库·microsoft