一、TCP 基础理论知识点 对应代码1.1 TCP 四大核心特点背诵知识点面向连接通信前三次握手建立连接流式无边界传输数据连续流传输需要固定缓冲区接收可靠传输自带确认重传无丢包全双工两端可同时收发数据1.2 Socket 核心构造参数知识点 对应代码知识点TCP 套接字固定三参数IPv4地址族、流式套接字、TCP协议// 对应考点TCP协议参数固定写法 new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);参数释义AddressFamily.InterNetwork使用 IPv4 协议SocketType.StreamTCP 流式传输ProtocolType.Tcp指定 TCP 通信协议二、服务端五步法new Socket()创建服务端监听对象Bind()绑定本机 IP 端口Listen(100)开启端口监听Accept()阻塞接收客户端连接Receive()循环接收客户端数据步骤1创建服务端Socket对象知识点代码知识点服务端全局声明Socket对象用于监听客户端连接// 服务端核心监听对象 Socket server null;步骤2自动获取本机IPv4地址知识点代码知识点自动遍历本机所有网卡筛选IPv4地址适配不同电脑string ipStr ; int port 63323; // 高位端口避免冲突 // 获取本机所有网络地址 IPHostEntry host Dns.GetHostEntry(Dns.GetHostName()); foreach (IPAddress item in host.AddressList) { // 只保留IPv4 if (item.AddressFamily AddressFamily.InterNetwork) { ipStr item.ToString(); } }步骤3绑定IP和端口Bind知识点代码知识点将Socket与本机IP、端口绑定对外开放服务端口IPAddress address IPAddress.Parse(ipStr); IPEndPoint endPoint new IPEndPoint(address, port); server.Bind(endPoint); // 绑定端口核心方法步骤4开启端口监听Listen知识点代码知识点Listen(最大挂起连接数)开启端口监听等待客户端接入server.Listen(100); // 允许最多100个排队连接步骤5异步监听多客户端连接Accept知识点代码知识点双层Task嵌套外层循环接收新客户端实现多客户端通信CancellationTokenSource cts; public void AcceptDataMul() { cts new CancellationTokenSource(); Task.Run(() { while (!cts.IsCancellationRequested) { // 阻塞接收客户端连接 Socket client server.Accept(); } }, cts.Token); }步骤6单客户端独立接收数据知识点代码知识点每个客户端独立子线程接收数据互不干扰修复TCP粘包BUG// 固定缓冲区解决TCP流式无边界粘包问题 byte[] buffer new byte[1024 * 10]; int length client.Receive(buffer); if (length 0) break; // 客户端离线断开步骤7跨线程UI更新必考知识点代码知识点子线程禁止直接操作UI必须使用Invoke回调主线程string recStr Encoding.UTF8.GetString(buffer, 0, length); Invoke(new Action(() { richTextBox1.AppendText(recStr Environment.NewLine); }));步骤8客户端断开资源释放知识点代码知识点捕获异常主动关闭套接字避免端口占用、内存泄漏catch (Exception) { client.Close(); client.Dispose(); break; }服务端关键考点自动筛选本机IPv4地址排除 IPv6多客户端原理双层 Task 外层循环 Accept 接客户端 内层每个客户端独立线程收数据跨线程 UI 报错解决子线程更新控件必须用InvokeTCP 粘包修复固定缓冲区new byte[1024*10]线程安全CancellationTokenSource安全终止后台任务四、客户端四步法创建客户端 Socket指定服务端IPEndPointIP 端口ConnectAsync 异步连接不卡死 UISend()发送数据步骤1声明客户端Socket知识点代码知识点单客户端通信仅需一个Socket对象Socket client;步骤2创建客户端Socket知识点代码知识点客户端参数与服务端一致保证通信协议匹配client new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);步骤3配置服务端终端节点知识点代码知识点客户端必须指定服务端精准IP端口才能连接IPEndPoint endpoint new IPEndPoint(IPAddress.Parse(192.168.219.12), 63323);步骤4异步连接服务端核心考点代码知识点ConnectAsync异步连接不阻塞UI主线程避免界面卡死await client.ConnectAsync(endpoint);步骤5连接成功UI状态联动知识点代码知识点禁止重复连接按钮状态互斥优化交互逻辑label1.Text 连接成功; button1.Enabled false; button2.Enabled true;步骤6连接失败容错处理知识点代码知识点捕获服务端未开启、IP错误、端口错误异常label1.Text 连接成功; button1.Enabled false; button2.Enabled true;五、客户端发送数据 知识点逐段对应5.1 连接状态校验防报错知识点代码知识点发送数据前必须判断Socket非空、处于连接状态if (client null || !client.Connected) { MessageBox.Show(还没连接到服务器请先连接服务器); return; }5.2 空数据校验规范考点代码知识点禁止发送空数据无效通信拦截if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show(发送数据不能为空); return; }5.3 UTF8编码转换乱码解决考点代码知识点收发统一UTF8编码彻底解决中文乱码byte[] data Encoding.UTF8.GetBytes(textBox1.Text); client.Send(data); label1.Text 发送成功;5.4 异常完整资源释放高频考点代码知识点三段式资源释放关闭通道→关闭连接→释放资源if (client ! null) { if (client.Connected) client.Shutdown(SocketShutdown.Both); // 关闭读写通道 client.Close(); // 关闭连接 client.Dispose(); // 释放资源 } // 重置按钮状态 button1.Enabled true; button2.Enabled false;客户端安全规范发送前判空client!null client.Connected禁止发送空字符串统一UTF8 编码防止中文乱码异常三步释放资源Shutdown→Close→Dispose五、高频易错点5.1 线程安全控制CancellationToken知识点使用取消令牌安全终止异步线程杜绝后台线程残留CancellationTokenSource cts2 new CancellationTokenSource(); Task.Run(() {}, cts2.Token);5.2 修复TCP原生粘包BUG知识点废弃 client.Available 动态缓冲区使用固定缓冲区循环接收// 正确写法 byte[] buffer new byte[1024 * 10]; int length client.Receive(buffer); // 错误原生写法已废弃 // byte[] buffer new byte[client.Available];禁止子线程直接操作 UI必须 InvokeTCP 无数据边界禁用 client.Available端口建议高位10000防冲突客户端 IP 必须与服务端本机 IPv4 一致必须异步连接同步 Connect 会卡死界面通信完毕必须释放资源否则端口占用、内存泄漏