C# WinForm TCP Socket

📅 2026/8/4 5:52:59 👁️ 阅读次数 📝 编程学习
C# WinForm TCP Socket

一、基础定义

  1. Socket(套接字)网络通信端点,负责程序之间的数据传输;IP地址(定位设备) + 端口号(定位程序) = Socket

  2. TCP 协议面向连接、可靠传输;通信前建立连接,数据不会丢失乱序。

  3. 命名空间(必须引入)

using System.Net; using System.Net.Sockets; using System.Threading.Tasks; using System.Threading;

二、核心类定义 + 语法

1. Socket 类

作用:创建套接字,网络通信核心对象 构造语法:

Socket 变量名 = new Socket(地址类型,传输类型,协议类型);

参数说明

  • AddressFamily.InterNetwork→ IPv4
  • SocketType.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. 地址相关类

  1. IPAddress:存放 IP 地址
IPAddress ip = IPAddress.Parse("192.168.1.10");
  1. 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 收发数据

五、重难点语法提醒

  1. Accept()Receive()属于阻塞方法,必须放在 Task 后台运行
  2. 收发数据只支持byte[],字符串必须进行编码转换
  3. 所有后台线程修改界面控件,必须套Invoke
  4. 通信结束必须调用Close()释放 Socket,否则端口占用
  5. 多客户端:每连接成功一个客户端,就要开启独立 Task 循环接收消息