Socket 类 常用方法 (C# .NET,TCP 场景)
前置: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,才能 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)socket.Available获取当前缓冲区已经收到、等待读取的字节数量
五、考试核心区分
- 服务端固定调用顺序
new Socket() → Bind() → Listen() → Accept() - 客户端固定调用顺序
new Socket() → Connect() → Send()/Receive() - 两个阻塞方法:
Accept()、Receive()👉 禁止直接在 UI 主线程执行,必须开 Task 后台线程!
六、易混点区分
- sever 监听 Socket:只做 Accept 监听,不和客户端收发消息
- Accept 返回的 clientSocket:专门负责和单个客户端通信,用来 Send/Receive
- 多客户端原理:每接入一个客户端,就生成一个独立 clientSocket 对象单独通信