ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

C# TCP服务器基础讲解

2026/9/15 8:05:29 拓冰建站 浏览量
C# TCP服务器基础讲解 一、TCP 到底是什么有什么实际作用1. 通俗理解 TCPTCP 就是稳定的网络传话通道是网络通信的基础协议特点不丢数据、不乱序、一对一可靠传输。类比生活UDP 写信丢件不管、顺序乱了不管TCP 打电话接通后稳定对话、说话内容不会丢、不会乱2. 你写的这个 TCP 服务器的用途你的代码实现了一个多客户端 TCP 服务端核心用途1 个服务器可以同时连接无数个客户端服务器可以接收所有客户端发来的消息服务器可以一键广播消息给所有在线客户端3. 现实开发场景为什么要学这个上位机连设备、相机通信、PLC 通信局域网聊天工具、设备状态监控服务端下发指令、客户端上传数据核心定位TCP 是 C# 工控、设备通信、网络开发的最基础、最常用的通信方式。二、TCP 完整运行流程极简总流程记住这套固定流程所有 TCP 程序全部通用1. 服务器流程绑定本机 IP 端口开启监听等待客户端来连接有客户端连接 → 保存客户端信息持续监听接收客户端消息支持主动发送消息/广播消息客户端下线 → 自动移除连接2. 客户端流程配套理解主动去找服务器 IP 端口三次握手建立连接给服务器发消息 / 接收服务器消息3. 当前项目完整工作流程启动服务 → 等待客户端接入 → 客户端连上 → 服务器持续接收客户端消息 → 服务器群发消息 → 客户端断开、自动清理连接三、核心语法重点解答1. 疑难语法_ ReadClientMsg(client, _endPoint);这是初学者最看不懂的语法专门通俗拆解_** 叫做「丢弃变量」**C# 语法规则所有 async 异步方法都会返回 Task 对象如果直接调用不接收返回值VS 会报警告、程序存在隐患。语法作用ReadClientMsg是异步接收客户端消息的方法业务中不需要使用它的返回值用_占位告诉编译器主动舍弃返回值无需报错警告整行代码人话解释客户端连接成功后单独开启一个后台线程为当前客户端创建专属消息监听通道持续接收该客户端的所有消息。四、完整版可运行 TCP 服务器代码以下是修复收不到消息、资源泄露、UI报错后的完整成品代码直接复制即可使用usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading.Tasks;usingSystem.Windows.Forms;namespace服务器{publicpartialclassForm1:Form{// TCP服务器监听对象负责监听端口、等待客户端连接TcpListener_server;// 任务取消令牌用于关闭服务、终止后台监听线程CancellationTokenSource_cts;// 客户端花名册存储所有在线客户端唯一IP端口为键客户端对象为值DictionaryEndPoint,TcpClient_clientsnewDictionaryEndPoint,TcpClient();publicForm1(){InitializeComponent();}// 启动/停止服务器按钮privatevoidbutton1_Click(objectsender,EventArgse){if(button1.Text启动){// 绑定本机IP和端口IPAddress_addressIPAddress.Parse(txtIP.Text);IPEndPointiPEndPointnewIPEndPoint(_address,int.Parse(txtPort.Text));_servernewTcpListener(iPEndPoint);// 启动服务器最大监听100个客户端_server?.Start(100);button1.Text停止;txtIP.Enabledfalse;txtPort.Enabledfalse;// 开启客户端连接监听AcceptRequest();}else{// 关闭服务、释放所有资源_cts?.Cancel();foreach(varcliin_clients.Values){cli.Close();}_clients.Clear();_server?.Stop();button1.Text启动;txtIP.Enabledtrue;txtPort.Enabledtrue;}}// 核心方法1持续监听客户端连接privatevoidAcceptRequest(){_ctsnewCancellationTokenSource();// 后台异步运行不卡死UITask.Run(async(){while(!_cts.IsCancellationRequested){try{// 无客户端连接则休眠等待if(!_server.Pending()){awaitTask.Delay(100);continue;}// 接收客户端连接TcpClientclientawait_server.AcceptTcpClientAsync();EndPoint_endPointclient.Client.RemoteEndPoint;// 登记新客户端if(!_clients.ContainsKey(_endPoint)){_clients.Add(_endPoint,client);}// 为当前客户端开启专属消息监听核心解决收不到消息问题_ReadClientMsg(client,_endPoint);}catch{break;}}},_cts.Token);}// 核心方法2持续读取单个客户端消息privateasyncTaskReadClientMsg(TcpClientclient,EndPointep){// 定义接收数据缓冲区byte[]buffernewbyte[1024*4];try{NetworkStreamstreamclient.GetStream();// 客户端在线、服务未关闭时持续监听while(client.Connected!_cts.IsCancellationRequested){// 异步读取客户端消息intlenawaitstream.ReadAsync(buffer,0,buffer.Length);if(len0)break;// 字节数组转字符串stringrecStrEncoding.UTF8.GetString(buffer,0,len);stringshowText$[{DateTime.Now:HH:mm:ss}] 客户端{ep}{recStr}\r\n;// 跨线程安全更新UI避免界面报错if(richTextBox1.InvokeRequired){richTextBox1.Invoke(newAction((){richTextBox1.AppendText(showText);richTextBox1.ScrollToCaret();}));}else{richTextBox1.AppendText(showText);richTextBox1.ScrollToCaret();}}}catch{}finally{// 客户端断开自动清理资源if(_clients.ContainsKey(ep)){_clients.Remove(ep);}client.Close();}}// 广播消息按钮给所有在线客户端发消息privatevoidbutton2_Click(objectsender,EventArgse){if(string.IsNullOrEmpty(txtMsg.Text))return;byte[]sendBufEncoding.UTF8.GetBytes(txtMsg.Text);// ToList避免遍历字典时集合变更报错foreach(varitemin_clients.ToList()){TcpClient_clientitem.Value;if(!_client.Connected)continue;try{NetworkStreamnetworkStream_client.GetStream();awaitnetworkStream.WriteAsync(sendBuf,0,sendBuf.Length);}catch{}}txtMsg.Text;}}}五、分模块代码逐句通俗讲解1. 全局变量模块// TCP服务器核心对象负责监听端口、接收连接TcpListener_server;// 线程取消控制器用于关闭服务、终止后台任务CancellationTokenSource_cts;// 客户端字典存放所有在线客户端实现一对多通信、广播DictionaryEndPoint,TcpClient_clientsnewDictionaryEndPoint,TcpClient();通俗解释提前定义好程序需要的核心工具全程全局可用贯穿整个通信流程。2. 服务启动/停止模块核心逻辑点击启动绑定IP端口、开启端口监听点击停止关闭服务、断开所有客户端、释放端口资源避免端口占用。3. 客户端连接监听模块AcceptRequest核心逻辑后台循环监听端口检测是否有客户端接入有新客户端连接后登记到字典花名册并为每个客户端单独开启消息监听通道。4. 消息接收核心模块ReadClientMsg整个程序最关键的模块解决「只能发消息、收不到消息」的问题为每个客户端单独开启循环监听实时读取客户端发送的字节数据转为可读字符串跨线程安全刷新UI避免程序崩溃客户端断开后自动清理资源防止内存泄露5. 广播发送模块核心逻辑遍历所有在线客户端批量发送消息实现服务器一键群发所有客户端。加了异常捕获和ToList处理避免程序报错。六、初学者必须记住的 5 条 TCP 核心常识服务器可以一对多1 个服务端可以同时挂载 N 个客户端每个客户端必须单独开线程收消息否则无法接收客户端数据TCP 是长连接协议连接建立后持续在线直到主动断开或网络中断收发必须成对客户端发-服务端收、服务端发-客户端收缺一不可网络操作必须异步执行同步写法会直接卡死WinForm界面七、整体运行逻辑总总结启动服务 → 绑定端口监听 → 客户端接入登记 → 开启专属消息监听 → 实时接收客户端消息 → 支持服务端广播下发消息 → 客户端下线自动清理资源八、补充服务器「启动按钮」核心作用针对你的疑问很多初学者搞不懂为什么必须点「启动」不点启动能不能通信1. 启动按钮的核心作用人话点击【启动】本质就是打开电脑的指定端口开门迎客开始监听、检测所有客户端的连接请求。没点启动 端口关闭、服务器休眠客户端怎么连都连不上收不到任何客户端消息无法发送广播消息2. 启动后专门用来「监控客户端连接状态」你想要的「查看客户端是否连接」全部依赖启动后的监听逻辑服务启动成功端口持续监听有客户端发起连接 → 程序自动捕获、存入客户端字典花名册实时判断客户端在线状态在线就收发消息客户端退出/断网 → 程序自动检测离线、清理连接3. 启动 / 停止 对应状态区别启动状态端口开放、持续监控客户端连接、可收发消息、支持一对多通信停止状态端口关闭、停止所有监听、断开全部客户端、彻底终止通信4. 关键总结启动按钮 开启监控客户端的开关所有「查看客户端是否在线、接收客户端消息、给客户端发广播」的功能全部建立在服务启动的前提下不启动服务所有TCP通信功能全部失效。