C# WinForm TCP Socket
📅 2026/8/4 5:52:59
👁️ 阅读次数
📝 编程学习
一、基础定义
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() | 服务端 | 阻塞等待客户端连接,返回客户端 Socket |
Connect(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. 集合类(多客户端服务端使用)
Dictionary<Key,Value>字典
//存储所有在线客户端 Dictionary<EndPoint, Socket> clients = new Dictionary<EndPoint, Socket>(); //添加 clients.Add(key,value); //遍历 foreach(var item in clients)List<T>泛型集合
List<Client> list = new List<Client>();三、自定义类语法(课堂 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 循环接收消息
编程学习
技术分享
实战经验