【网络】C#TCP 通讯

C# .NET 中,TCP 通信的相关类全部位于 System.Net.Sockets 命名空间下,微软按照使用难度、功能层级 做了分层封装:从极简易用的高层类 (适合90%日常开发),到灵活底层的基类 (自定义需求),再到高性能并发类(高吞吐服务)。

下面按推荐优先级分类讲解,附核心用途和选型建议:


一、首选:高层封装类(简单易用,新手/常规开发必用)

这是 .NET 为 TCP 通信封装的简化工具类,屏蔽了底层 Socket 复杂细节,开箱即用,是家用项目、客户端/服务端小工具的最优选择。

类名 角色 核心作用
TcpListener 服务端专用 监听客户端的连接请求(绑定IP+端口,等待接入)
TcpClient 客户端专用 主动连接服务端,收发数据
NetworkStream 通用 基于流模式读写 TCP 数据(配合 TcpClient 使用,最方便)

✅ 适用场景:常规客户端/服务端、文件传输、消息通讯、家用NAS通讯、物联网小工具


二、底层基类:Socket 类(全能灵活,所有TCP通信的基础)

TcpListener/TcpClient 底层都是基于 Socket 实现的

这是最原始、功能最强大的网络类,支持 TCP/UDP,可完全自定义通信逻辑。

✅ 核心能力:

  • 手动绑定、监听、连接、收发数据
  • 自定义超时、缓冲区、套接字选项
  • 兼容所有网络协议

❌ 缺点:代码繁琐,需要手动处理异常、粘包、连接断开

✅ 适用场景:需要高度自定义的网络框架、跨协议通信、底层组件开发


三、高性能类(高并发/高吞吐服务端专用)

适合游戏服务器、高并发网关、工业通讯等海量连接场景,.NET 专门优化的高性能 API:

类名 核心优势
SocketAsyncEventArgs 基于IOCP(完成端口) 的异步模型,无线程开销,Windows/Linux 高性能首选
System.IO.Pipelines .NET Core 2.1+ 推出的现代高性能IO库,专门解决 TCP 粘包/分包问题,微软官方推荐

✅ 适用场景:高并发服务器、低延迟通讯、大数据量传输


四、快速选型(直接照抄)

  1. 新手/普通项目TcpListener + TcpClient + NetworkStream(90% 场景)
  2. 自定义通信逻辑Socket
  3. 高并发服务器SocketAsyncEventArgs / Pipelines

五、极简代码示例(最常用的高层类)

1. TCP 服务端(TcpListener)

csharp 复制代码
using System.Net;
using System.Net.Sockets;
using System.Text;

// 异步TCP服务端
async Task StartTcpServerAsync()
{
    // 监听本机所有IP,端口8888
    var listener = new TcpListener(IPAddress.Any, 8888);
    listener.Start();
    Console.WriteLine("服务端已启动,等待客户端连接...");

    // 循环接受客户端连接
    while (true)
    {
        // 等待客户端接入
        TcpClient client = await listener.AcceptTcpClientAsync();
        Console.WriteLine("客户端已连接");
        // 独立处理客户端数据(异步不阻塞)
        _ = HandleClientAsync(client);
    }
}

// 处理客户端收发数据
async Task HandleClientAsync(TcpClient client)
{
    using (client)
    using (NetworkStream stream = client.GetStream())
    {
        byte[] buffer = new byte[1024];
        // 读取客户端数据
        int len = await stream.ReadAsync(buffer);
        string msg = Encoding.UTF8.GetString(buffer, 0, len);
        Console.WriteLine($"收到:{msg}");

        // 回复客户端
        byte[] reply = Encoding.UTF8.GetBytes("服务端已收到");
        await stream.WriteAsync(reply);
    }
}

2. TCP 客户端(TcpClient)

csharp 复制代码
using System.Net.Sockets;
using System.Text;

async Task StartTcpClientAsync()
{
    TcpClient client = new TcpClient();
    await client.ConnectAsync("127.0.0.1", 8888); // 连接服务端
    Console.WriteLine("已连接服务端");

    using (NetworkStream stream = client.GetStream())
    {
        // 发送数据
        byte[] data = Encoding.UTF8.GetBytes("你好,服务端");
        await stream.WriteAsync(data);

        // 接收回复
        byte[] buffer = new byte[1024];
        int len = await stream.ReadAsync(buffer);
        string msg = Encoding.UTF8.GetString(buffer, 0, len);
        Console.WriteLine($"收到回复:{msg}");
    }
}

补充重要说明

  1. 跨平台 :所有类在 .NET Framework / .NET Core / .NET 5~8 全平台支持(Windows/Linux/macOS);

  2. 异步优先 :推荐使用 async/await 异步方法(避免界面卡顿);

  3. 粘包问题 :TCP 是流协议,会出现粘包,System.IO.Pipelines 是最优解决方案;

  4. 命名空间 :所有 TCP 核心类都需要引用:

    csharp 复制代码
    using System.Net.Sockets;

总结

  1. 日常开发无脑用TcpListener(服务端) + TcpClient(客户端) + NetworkStream(流读写)
  2. 底层自定义Socket
  3. 高性能高并发SocketAsyncEventArgs / System.IO.Pipelines
相关推荐
apihz1 小时前
台风实时与历史详情查询免费 API 接口完整教程
android·开发语言·tcp/ip·dubbo·台风·天气预报
品尚公益团队2 小时前
C#在asp.net网页开发中的带cookie登录实现
前端·c#·asp.net
吴可可1232 小时前
C#自定义CAD多段线零件实体
c#
CallmeFoureyes2 小时前
使用 C# 提取 Word 文档中的表格数据
开发语言·c#·word
阿米亚波2 小时前
【EVE-NG 实战】防火墙基础(VLAN · VRRP · NAT · ACL · 静态路由)
运维·网络·笔记·网络协议·计算机网络·网络安全·运维开发
零意@2 小时前
海光平台debian11的系统,打开pstore功能和验证功能
网络
blueman88882 小时前
qt5-serialbus详细解析
开发语言·网络·qt
学究天人3 小时前
数学公理体系大全:Comprehensive Collection of Mathematical Axiom Systems(卷6)
网络·算法·数学建模·动态规划·几何学·图论·拓扑学
tiantianuser3 小时前
NVME-oF IP 设计2 :设计之前的调研!
网络·网络协议·rdma·roce v2·nvme of
星恒讯工业路由器4 小时前
工业无线通信选型常见问题解答
网络·信息与通信·无线ap·设备选型·工业无线通信·防爆无线设备·4g/5g路由器