C# TCP通信入门:服务端监听与客户端连接实战

慢慢来
慢慢来
发布时间:2026-10-13| 3人浏览过
原创

C#中基于Socket的网络通信主要依赖 System.Net.Sockets 命名空间。对于希望快速构建可靠数据传输应用的开发者,TcpListener(服务端)与 TcpClient(客户端)提供了比底层 Socket 更高层级的封装。本文将解析TCP核心特点,并给出完整的初始化与连接流程。

TCP协议特性与线程处理机制

TCP(传输控制协议)是 TCP/IP 体系中最核心的传输协议,其核心价值在于提供全双工(Full-Duplex)、面向连接且可靠交付的服务。大多数上层应用协议如 HTTP、FTP、SMTP 等均建立在 TCP 之上。

核心通信特征

  • 面向连接:通信前必须经历"建立连接 → 传输数据 → 终止连接"的标准三次握手与四次挥手过程。
  • 一对一:每个TCP连接仅限两个端点,不支持点对多点的直接广播。
  • 字节流传输:数据以无消息边界(Message Boundary-less)的字节流方式传输,需在应用层自行定义消息结束符或长度头。
  • 可靠性:具备确认机制、重传机制和高可靠性保障。

工作模式:同步阻塞 vs 异步非阻塞

在.NET框架下,开发TCP应用涉及两种基本工作方式,直接影响程序架构设计:

  • 同步工作方式(Blocking):当执行 AcceptTcpClient 或读取操作时,当前线程会暂停执行(阻塞),直到数据到达或超时才恢复。适用于简单的单任务串行处理。
  • 异步工作方式(Non-blocking/Asynchronous):启动监听或收发后,立即将控制权交还给主程序继续向下执行,通常配合回调函数或 Task 异步模型(如 async/await)使用。

核心API与编程准备

所有操作均在 System.Net.Sockets 命名空间下完成。常用的操作类如下:

TcpListener(服务端角色)常用方法

  • Start():开始监听传入的连接请求。
  • Stop():关闭监听器。
  • AcceptTcpClient():从端口接收一个连接请求,返回已连接的 TcpClient 对象(该方法在同步模式下为阻塞调用)。
  • Pending():检查是否有挂起的连接请求。

TcpClient(连接对象)常用属性与方法

  • Connect(IPAddress, Int32):使用指定的主机名和端口号连接到TCP主机。
  • GetStream():获取用于发送和接收数据的 NetworkStream 对象(最关键的通信入口)。
  • NoDelay:若设为 true,则禁止延迟算法(Nagle Algorithm),立即发送小数据包;默认 false。
  • SendBufferSize / ReceiveBufferSize:配置收发缓存区大小。

第一步:编写服务器端监听程序

服务端的主要职责是持续监听特定端口,并在接收到新连接后创建独立的会话通道。

1. 初始化与绑定端口

使用 IPAddress.Parse 或 Dns.GetHostAddresses 获取本地IP,指定端口号(例如 58080)实例化 TcpListener 并调用 Start()。

2. 循环等待与处理客户端

在一个后台线程中运行 while(true) 循环,调用 tcpListener.AcceptTcpClient()。
每成功接收一次连接:
1. 通过 GetStream() 获取 NetworkStream。
2. 建议将该流包装为 BinaryReader 和 BinaryWriter,以便按文本或结构化方式读写。
3. 由于 AcceptTcpClient 是阻塞操作,需确保它不在主 UI 线程中执行,或在接收新连接后为其分派独立线程进行后续通信。

// C# Server-Side Stub Logic (Simplified)
// 必须在 using System.Net; and System.Net.Sockets; 环境下运行
TcpListener tcpListener = new TcpListener(ipAddress, port);
tcpListener.Start();

while(true) {
    // 阻塞直到有客户端连接
    TcpClient client = tcpListener.AcceptTcpClient(); 
    NetworkStream stream = client.GetStream();
    BinaryReader reader = new BinaryReader(stream);
    BinaryWriter writer = new BinaryWriter(stream);

    // 此处应开启新线程处理该client的数据收发
    Thread worker = new Thread(() => HandleClient(reader, writer));
    worker.Start();
}

第二步:编写客户端连接程序

客户端需要知道服务端的 IP 和 Port,并通过 Connect 发起握手。

1. 创建连接对象

构造 IPEndPoint 结构体封装目标地址,直接传入 TcpClient 构造函数自动建立连接;或者先实例化后手动调用 tcpClient.Connect()。

2. 获取流并维持长连接

连接成功后,同样获取 NetworkStream。通常在另一个线程中启动死循环,利用 reader.ReadString() 持续监听服务端推送的消息。

// C# Client-Side Stub Logic (Simplified)
// 必须在 using System.Net; and System.Net.Sockets; 环境下运行
IPEndPoint ipPoint = new IPEndPoint(targetAddress, port);
TcpClient client = new TcpClient(ipPoint);

if (client.Connected) {
    NetworkStream networkStream = client.GetStream();
    BinaryReader binRead = new BinaryReader(networkStream);
    BinaryWriter binWrite = new BinaryWriter(networkStream);

    while(true) {
        try {
            string msg = binRead.ReadString();
            if (string.IsNullOrEmpty(msg)) break;
            Console.WriteLine("Server: " + msg);
        } catch { 
            break; 
        }
    }
}

注意事项

原文示例使用了 Dns.GetHostAddresses("www.baidu.com") 来强行生成一个本地IP数组并取第一个元素,这种做法在实际开发中存在隐患:
1. DNS 查询可能失败或返回错误类型IP。
2. 正确做法应使用 IPAddress.Loopback (即 127.0.0.1) 代表 localhost,或使用 Dns.GetHostEntry(Dns.GetHostName()).AddressList[0] 获取本机真实网卡的IPv4地址。

完成判断标准

  • 服务端:日志打印了客户端接入信息,未因 AcceptTcpClient 造成主UI假死(如果使用的是多线程方案)。
  • 客户端:能成功弹框显示收到的文本,且在服务端断开后可触发退出异常跳出循环,释放资源。
  • 排错:如果抛出 SocketException 提示“拒绝访问”或“无法建立连接”,请优先检查系统防火墙是否放行了对应的 TCP 端口,以及服务端是否已在指定IP上调用了 Start()。

总结

TCP 通信是 C# 网络开发的基石。虽然原生的 Socket 类功能最全面,但对于大多数常规业务(如即时通讯、RPC 调用、文件上传),直接使用 TcpListener 搭配 TcpClient 能够大幅简化 API 的复杂度。掌握 NetworkStream 的生命周期管理与线程安全是写好高性能服务端的关键。以上就是C#基于TcpListener/TcpClient实现TCP通信的详细内容,更多关于C#网络编程的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。