【网络】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
相关推荐
汪汪大队u7 小时前
续:从 Docker Compose 到 Kubernetes(2)—— 服务优化与排错
网络·后端·物联网·struts·容器
没什么本事8 小时前
关于C# panel 添加lable问题 -- 明确X和Y 位置错误
android·java·c#
m0_738120729 小时前
ctfshow靶场SSRF部分——基础绕过到协议攻击解题思路与技巧(一)
服务器·前端·网络·安全·php
火星papa9 小时前
C# 实现平滑流畅的进度条ProgressBar
c#·进度条·progressbar·平滑流畅
现代野蛮人10 小时前
【深度学习】 —— VGG-16 网络实现猫狗识别
网络·人工智能·python·深度学习·tensorflow
2301_7807896610 小时前
“数字珍珠港”再现:西北能源基地DNS篡改事件深度复盘与防护升级
运维·服务器·网络·tcp/ip·网络安全·智能路由器·能源
S1998_1997111609•X10 小时前
针对犯罪集团etc/all,pid,IP的规划及量化逻辑原理
网络·安全·百度·缓存·量子计算
徐子元竟然被占了!!10 小时前
摄像头安全策略
网络
游乐码11 小时前
UnityGUI(五)GUI控件综合使用
开发语言·unity·c#
程序leo源11 小时前
C语言知识总结
c语言·开发语言·c++·经验分享·笔记·青少年编程·c#