ARTICLE DETAIL

建站实战干货

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

C# WinForm Socket 类 常用方法 (C# .NET,TCP 场景)

2026/8/4 5:25:53 拓冰建站 浏览量
C# WinForm Socket 类 常用方法 (C# .NET,TCP 场景) Socket 类 常用方法 C# .NETTCP 场景前置Socket 通信分为【服务端方法】、【两端通用方法】阻塞方法重点标记 阻塞方法代码执行到这里会卡住不动直到事件发生直接写在窗体主线程会造成窗口卡死必须放在Task.Run后台线程一、构造方法创建 Socket 对象Socket socket new Socket(AddressFamily, SocketType, ProtocolType);参数解释AddressFamily.InterNetwork→ 使用IPv4SocketType.Stream→ 流式传输搭配 TCP 使用ProtocolType.Tcp→ TCP 协议//课堂标准写法 Socket sever new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);二、仅【服务端】使用的方法1. Bind(IPEndPoint localEP)✅作用套接字绑定本机 IP 地址 端口号告诉操作系统这个 Socket 占用指定 IP 和端口用来接收客户端连接只能服务端调用客户端禁止使用IPEndPoint endPoint new IPEndPoint(IPAddress.Parse(192.168.1.10),63323); sever.Bind(endPoint);⚠️坑端口被别的程序占用调用 Bind 直接抛异常。2. Listen(int backlog)✅作用开启端口监听等待客户端发起连接 参数backlog最大等待连接队列长度sever.Listen(100);顺序要求必须先 Bind才能 Listen3. Accept () 【阻塞方法重点】✅作用等待客户端接入有客户端连接进来返回一个全新 Socket返回的新 Socket专门和当前这个客户端一对一通信原始 sever 套接字只负责监听不负责收发消息Socket clientSocket sever.Accept();特点没有客户端连接时代码在这里一直阻塞卡住所以必须放进 Task 后台线程。三、服务端、客户端【两端通用方法】1. Connect(IPEndPoint remoteEP)✅作用客户端专属核心向服务端发起连接请求同步连接IPEndPoint serverEp new IPEndPoint(IPAddress.Parse(192.168.1.10),63323); client.Connect(serverEp);同步阻塞连不上服务器程序会卡在这里。2. ConnectAsync(IPEndPoint)✅异步版本连接你客户端代码在用不阻塞界面搭配await使用WinForm 首选await client.ConnectAsync(endPoint);3. Send(byte[] buffer)✅作用向对方发送数据 ⚠️规则Socket只能发送字节数组 byte []不能直接发送字符串string msg 测试消息; byte[] data Encoding.UTF8.GetBytes(msg); //字符串转字节数组 socket.Send(data);4. Receive (byte [] buffer) 【阻塞方法】✅作用接收远端发送过来的数据存入字节数组 返回值 int实际收到字节长度byte[] buffer new byte[1024]; //缓冲区 int len socket.Receive(buffer); //把字节转回字符串 string recMsg Encoding.UTF8.GetString(buffer,0,len);重点特性对方没有发送任何数据时方法阻塞等待客户端下线Receive 会立刻返回 0 / 抛出异常。new byte[client.Available]临时写法正式项目不推荐5. Shutdown(SocketShutdown)✅作用优雅关闭连接停止收发数据 枚举三种模式SocketShutdown.Send禁止继续发送SocketShutdown.Receive禁止继续接收SocketShutdown.Both同时禁止收发最常用规范流程先 Shutdown → 再 Close不要直接粗暴 Close6. Close()✅ 关闭套接字释放端口、网络资源 ⚠️问题如果不手动 Close程序异常退出可能导致端口持续占用7. Dispose()✅ 释放 Socket 托管资源.NET 推荐写法Close 底层本质也是调用 Dispose四、补充常用属性socket.RemoteEndPoint获取远端地址连接的对方 IP 端口客户端字典的 KeyEndPoint end socket.RemoteEndPoint;socket.Connectedbool 类型判断当前 Socket 是否处于连接状态if(socket.Connected)socket.Available获取当前缓冲区已经收到、等待读取的字节数量五、考试核心区分服务端固定调用顺序new Socket() → Bind() → Listen() → Accept()客户端固定调用顺序new Socket() → Connect() → Send()/Receive()两个阻塞方法Accept()、Receive() 禁止直接在 UI 主线程执行必须开 Task 后台线程六、易混点区分sever 监听 Socket只做 Accept 监听不和客户端收发消息Accept 返回的 clientSocket专门负责和单个客户端通信用来 Send/Receive多客户端原理每接入一个客户端就生成一个独立 clientSocket 对象单独通信