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

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

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

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客户端实现

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();
    }
}

三、使用示例

服务器启动

var server = new TcpServer(8888);
await server.StartAsync();

客户端连接与通信

using var client = new TcpClientDemo("127.0.0.1", 8888);
await client.SendAsync("Hello Server!");
client.Disconnect();

四、关键特性实现

1. 异步通信优化

// 使用异步方法提升并发性能
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. 异常处理机制

try
{
   
    // 通信逻辑
}
catch (SocketException ex) when (ex.SocketErrorCode == SocketError.ConnectionReset)
{
   
    Console.WriteLine("客户端异常断开连接");
}
catch (TimeoutException)
{
   
    Console.WriteLine("操作超时,请检查网络状态");
}

3. 数据帧处理(带长度前缀)

// 发送带长度前缀的数据
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);

五、性能优化

  1. 缓冲区管理

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

    // 实现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. 流量控制

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

六、完整项目结构

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

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

七、调试与监控

  1. 日志记录

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

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

八、扩展功能实现

1. 心跳检测机制

// 客户端定时发送心跳包
private async Task SendHeartbeatAsync()
{
   
    while (true)
    {
   
        await _stream.WriteAsync(Encoding.UTF8.GetBytes("HEARTBEAT"));
        await Task.Delay(TimeSpan.FromSeconds(30));
    }
}

2. 加密通信

// 使用TLS加密
var sslStream = new SslStream(_stream, false);
var sslClient = new SslClientAuthenticationOptions
{
   
    TargetHost = "server.example.com",
    EnabledSslProtocols = SslProtocols.Tls12
};
await sslStream.AuthenticateAsClientAsync(sslClient);
目录
相关文章
|
Ubuntu 安全 机器人
把Windows打造成一个NTP时间同步服务器
把Windows打造成一个NTP时间同步服务器
把Windows打造成一个NTP时间同步服务器
|
5月前
|
编译器 数据库连接 API
深入理解C#密封类(sealed)——掌握C#密封类的使用场景与设计限制
在C#中,密封类(sealed class)通过`sealed`关键字防止被继承,用于提升安全性、性能与设计明确性。适用于工具类、不可变对象等场景,是面向对象设计的重要手段。
|
1月前
|
人工智能 自然语言处理 安全
2026 最新版 OpenClaw 极速安装方案,缩短 90% 部署时间(包含新安装包)
传统 OpenClaw 安装需要依次配置环境、下载依赖、手动汉化,耗时又容易出错。2026 最新版一键安装包对流程进行全面优化,将所有步骤整合为全自动模式,大幅缩短安装时间,无需等待、无需调试、无需重复操作,几分钟内完成全部部署,安装后即可直接使用中文版,高效省心,适合追求快速体验的用户。
|
10月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
1235 27
|
4月前
|
人工智能 JSON Linux
玩转Ollama函数调用:让AI从“光说不练”到“动手解决问题”
你是否厌倦AI瞎编答案?Ollama函数调用功能为AI装上“小手”,让它能调用天气查询、计算器等自定义工具,先做事、再回答,告别胡说八道!本文手把手教你从零实现单次调用、并行调用、多轮智能体循环及流式响应,全程Python实战,小白也能轻松上手。
|
4月前
|
存储 人工智能 数据处理
2026年阿里云对象存储OSS最新收费标准价格表:
阿里云OSS按存储、流量、请求等维度收费,核心模式为按量付费与资源包(包年包月),未用功能不计费。主要费用为存储费(标准/低频/归档等类型)和流量费(仅公网流出,分闲忙时计费),另有请求、数据处理等增值费用。开通、上传及内网流量免费,新用户享免费额度,官网提供精准报价。
|
9月前
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
1950 0
|
C# 索引
C#学习相关系列之base和this的常用方法
C#学习相关系列之base和this的常用方法
426 0
|
敏捷开发 人工智能 API
如何快速部署大模型接口管理和分发系统:One-API
One API 是一个开源的接口管理与分发系统,支持多种大模型平台如 OpenAI、Google PaLM 2、百度文心一言等。通过统一接口访问不同大模型服务,简化工作流程并提高效率。适用于多模型集成项目、开发代理服务、教育研究及快速原型制作等多种场景。阿里云计算巢提供了快速部署方案,简化了部署过程。
2370 5
|
开发框架 前端开发 JavaScript
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件
循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(3)--自定义用户控件

热门文章

最新文章