ARTICLE DETAIL

建站实战干货

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

C# WinForm TCP Socket

2026/8/4 5:31:54 拓冰建站 浏览量
C# WinForm TCP Socket 一、基础定义Socket套接字网络通信端点负责程序之间的数据传输IP地址定位设备 端口号定位程序 SocketTCP 协议面向连接、可靠传输通信前建立连接数据不会丢失乱序。命名空间必须引入using System.Net; using System.Net.Sockets; using System.Threading.Tasks; using System.Threading;二、核心类定义 语法1. Socket 类作用创建套接字网络通信核心对象 构造语法Socket 变量名 new Socket(地址类型,传输类型,协议类型);参数说明AddressFamily.InterNetwork→ IPv4SocketType.Stream→ TCP 流式传输ProtocolType.Tcp→ 使用 TCP 协议Socket 常用方法方法使用端作用Bind(IPEndPoint)服务端绑定本机 IP 和端口Listen(int)服务端开启端口监听参数为最大排队连接数Accept()服务端阻塞等待客户端连接返回客户端 SocketConnect(IPEndPoint)客户端同步连接服务器ConnectAsync()客户端异步连接不卡死窗口Send(byte[])两端发送字节数组数据Receive(byte[])两端阻塞接收字节数据Shutdown(SocketShutdown.Both)两端停止收发数据规范关闭前置Close()/Dispose()两端关闭套接字释放端口资源2. 地址相关类IPAddress存放 IP 地址IPAddress ip IPAddress.Parse(192.168.1.10);IPEndPoint终端对象 IP 端口IPEndPoint endPoint new IPEndPoint(ip, 63323);3. 字符串 ↔ 字节数组⚠️网络只能传输 byte []不能直接传输 string//发送字符串 → 字节数组 byte[] arr Encoding.UTF8.GetBytes(消息内容); //接收字节数组 → 字符串 string text Encoding.UTF8.GetString(字节数组);4. Task 后台任务定义新开后台线程避免Accept()、Receive()阻塞导致窗体卡死 语法Task.Run((){ //后台执行代码 });5. CancellationTokenSource定义安全终止循环后台任务替代危险的强制关闭线程//创建取消信号对象 CancellationTokenSource cts new CancellationTokenSource(); //判断是否需要终止循环 while(!cts.IsCancellationRequested) //发送停止信号 cts.Cancel();6. Invoke【必考语法跨线程访问控件】定义后台线程不允许直接操作 WinForm 控件会报错跨线程操作无效。 标准语法Invoke(new Action((){ //此处写所有控件操作代码 richTextBox1.AppendText(收到消息); }));7. 集合类多客户端服务端使用DictionaryKey,Value字典//存储所有在线客户端 DictionaryEndPoint, Socket clients new DictionaryEndPoint, Socket(); //添加 clients.Add(key,value); //遍历 foreach(var item in clients)ListT泛型集合ListClient list new ListClient();三、自定义类语法课堂 Client 类封装客户端信息public class Client { public EndPoint EndPoint { get; set; } public Socket Socket { get; set; } }四、TCP 通信标准流程背诵服务端new Socket → Bind 绑定 → Listen 监听 → Accept 等待客户端连接 → Send/Receive 收发数据客户端new Socket → ConnectAsync 连接服务器 → Send/Receive 收发数据五、重难点语法提醒Accept()、Receive()属于阻塞方法必须放在 Task 后台运行收发数据只支持byte[]字符串必须进行编码转换所有后台线程修改界面控件必须套Invoke通信结束必须调用Close()释放 Socket否则端口占用多客户端每连接成功一个客户端就要开启独立 Task 循环接收消息