C# WinForm Socket 类 常用方法 (C# .NET,TCP 场景)
2026/8/4 5:25:38 网站建设 项目流程

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

前置:Socket 通信分为【服务端方法】、【两端通用方法】;阻塞方法重点标记! 阻塞方法:代码执行到这里会卡住不动,直到事件发生,直接写在窗体主线程会造成窗口卡死,必须放在Task.Run后台线程!

一、构造方法(创建 Socket 对象)

Socket socket = new Socket(AddressFamily, SocketType, ProtocolType);

参数解释

  1. AddressFamily.InterNetwork→ 使用IPv4
  2. SocketType.Stream→ 流式传输,搭配 TCP 使用
  3. 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,才能 Listen

3. 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,不要直接粗暴 Close

6. Close()

✅ 关闭套接字,释放端口、网络资源 ⚠️问题:如果不手动 Close,程序异常退出可能导致端口持续占用

7. Dispose()

✅ 释放 Socket 托管资源,.NET 推荐写法;Close 底层本质也是调用 Dispose


四、补充常用属性

  • socket.RemoteEndPoint获取远端地址(连接的对方 IP + 端口,客户端字典的 Key)
EndPoint end = socket.RemoteEndPoint;
  • socket.Connectedbool 类型,判断当前 Socket 是否处于连接状态
if(socket.Connected)
  1. socket.Available获取当前缓冲区已经收到、等待读取的字节数量

五、考试核心区分

  1. 服务端固定调用顺序new Socket() → Bind() → Listen() → Accept()
  2. 客户端固定调用顺序new Socket() → Connect() → Send()/Receive()
  3. 两个阻塞方法:Accept()Receive()👉 禁止直接在 UI 主线程执行,必须开 Task 后台线程!

六、易混点区分

  • sever 监听 Socket:只做 Accept 监听,不和客户端收发消息
  • Accept 返回的 clientSocket:专门负责和单个客户端通信,用来 Send/Receive
  • 多客户端原理:每接入一个客户端,就生成一个独立 clientSocket 对象单独通信

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询