基于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时间同步服务器
|
XML Java Android开发
Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)
Android Studio App开发之使用相机拍摄照片和从相册中选取图片(附源码 超详细必看)
2631 2
|
6月前
|
人工智能 自然语言处理 JavaScript
阿里云JVS Claw是什么?OpenClaw一键接入,轻松养虾!
阿里云推出“一键养虾”平台JVS Claw,基于OpenClaw火爆生态,集成AI智能体(Clawbot)与专属云端环境(CloudSpace),支持自然语言驱动应用操作、文件处理等复杂任务。零门槛创建、多风格定制、预置技能、分屏可视化执行,让每位用户轻松拥有专属“龙虾”AI助手。
854 3
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
1496 27
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
910 0
|
机器学习/深度学习 文字识别 监控
安全监控系统:技术架构与应用解析
该系统采用模块化设计,集成了行为识别、视频监控、人脸识别、危险区域检测、异常事件检测、日志追溯及消息推送等功能,并可选配OCR识别模块。基于深度学习与开源技术栈(如TensorFlow、OpenCV),系统具备高精度、低延迟特点,支持实时分析儿童行为、监测危险区域、识别异常事件,并将结果推送给教师或家长。同时兼容主流硬件,支持本地化推理与分布式处理,确保可靠性与扩展性,为幼儿园安全管理提供全面解决方案。
860 3
|
9月前
|
网络协议 安全 C#
C# 实现基于 TCP 的简单聊天程序(服务端)
基于TcpListener实现TCP聊天服务器,监听指定端口,接收客户端连接并实时转发消息。支持多客户端并发通信,新连接自动加入广播列表,断开后自动移除,确保线程安全与稳定运行。
|
监控 算法 C#
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
C#与Halcon联合编程实现鼠标控制图像缩放、拖动及ROI绘制
2617 0
|
缓存 前端开发 API
(网页系统集成CAD功能)在线CAD中配置属性的使用教程
本文介绍了Mxcad SDK在线预览和编辑CAD图纸的功能及配置方法。通过Vite、CDN或Webpack实现集成,用户可自定义设置以满足项目需求。主要内容包括:1)`createMxCad()`方法的初始属性配置,如画布ID、WASM文件路径、字体加载路径等;2)`MxFun.setIniset()`方法提供的更多CAD初始配置;3)`McObject`对象API用于动态调整视图背景色、浏览模式等。此外,还提供了在线Demo(https://demo2.mxdraw3d.com:3000/mxcad/)供用户测试实时效果。
|
人工智能 缓存 NoSQL
Redis 与 AI:从缓存到智能搜索的融合之路
Redis 已从传统缓存系统发展为强大的 AI 支持平台,其向量数据库功能和 RedisAI 模块为核心,支持高维向量存储、相似性搜索及模型服务。文章探讨了 Redis 在实时数据缓存、语义搜索与会话持久化中的应用场景,并通过代码案例展示了与 Spring Boot 的集成方式。总结来看,Redis 结合 AI 技术,为现代应用提供高效、灵活的解决方案。