基于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);
相关推荐
M78佐菲2 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
Brilliantwxx2 小时前
【Linux】 进程(9)程序与进程地址空间(基础+进阶+面试题)
linux·运维·服务器·开发语言·c++
不怕犯错,就怕不做2 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
geovindu3 小时前
CSharp: 万年历
开发语言·后端·c#·.net
weixin_416667963 小时前
【无标题】
运维·服务器·网络
上海云盾-小余6 小时前
流量攻击复盘:为什么 WAF 完好,业务依旧瘫痪
运维·服务器·网络
米饭不加菜6 小时前
ESP-01S通过TCP直接与手机建立通信
网络·tcp/ip·智能手机
Huathy-雨落江南,浮生若梦7 小时前
Caddy 学习笔记 - 反向代理与 IP 封禁
笔记·学习·tcp/ip
我命由我123457 小时前
Linux - Linux/POSIX 路径斜杠折叠规则
linux·运维·服务器·android studio·android jetpack·android-studio·android runtime
Uncertainty!!8 小时前
Linux 主机无法完成校园网认证排查记录:从 DHCP、ARP 到 Portal 认证流程分析
linux·运维·服务器