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

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

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

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

cs 复制代码
Socket socket = new Socket(AddressFamily, SocketType, ProtocolType);

参数解释

  1. AddressFamily.InterNetwork → 使用 IPv4
  2. SocketType.Stream → 流式传输,搭配 TCP 使用
  3. ProtocolType.Tcp → TCP 协议
cs 复制代码
//课堂标准写法
Socket sever = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

二、仅【服务端】使用的方法

1. Bind(IPEndPoint localEP)

作用 :套接字绑定本机 IP 地址 + 端口号

  • 告诉操作系统:这个 Socket 占用指定 IP 和端口,用来接收客户端连接
  • 只能服务端调用,客户端禁止使用
cs 复制代码
IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.1.10"),63323);
sever.Bind(endPoint);

⚠️坑:端口被别的程序占用,调用 Bind 直接抛异常。

2. Listen(int backlog)

作用 :开启端口监听,等待客户端发起连接 参数 backlog:最大等待连接队列长度

cs 复制代码
sever.Listen(100);

顺序要求:必须先 Bind,才能 Listen

3. Accept () 【🔴阻塞方法!重点】

作用 :等待客户端接入;有客户端连接进来,返回一个全新 Socket

  • 返回的新 Socket:专门和当前这个客户端一对一通信!
  • 原始 sever 套接字只负责监听,不负责收发消息!
cs 复制代码
Socket clientSocket = sever.Accept(); 

特点

没有客户端连接时,代码在这里一直阻塞卡住,所以必须放进 Task 后台线程。


三、服务端、客户端【两端通用方法】

1. Connect(IPEndPoint remoteEP)

作用(客户端专属核心):向服务端发起连接请求(同步连接)

cs 复制代码
IPEndPoint serverEp = new IPEndPoint(IPAddress.Parse("192.168.1.10"),63323);
client.Connect(serverEp);

🔴同步阻塞!连不上服务器程序会卡在这里。

2. ConnectAsync(IPEndPoint)

异步版本连接(你客户端代码在用) 不阻塞界面,搭配await使用,WinForm 首选

cs 复制代码
await client.ConnectAsync(endPoint);

3. Send(byte\[\] buffer)

作用 :向对方发送数据 ⚠️规则:Socket只能发送字节数组 byte \[\],不能直接发送字符串

cs 复制代码
string msg = "测试消息";
byte[] data = Encoding.UTF8.GetBytes(msg); //字符串转字节数组
socket.Send(data);

4. Receive (byte \[\] buffer) 【🔴阻塞方法!】

作用 :接收远端发送过来的数据,存入字节数组 返回值 int:实际收到字节长度

cs 复制代码
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)
cs 复制代码
EndPoint end = socket.RemoteEndPoint;
  • socket.Connected bool 类型,判断当前 Socket 是否处于连接状态
cs 复制代码
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 对象单独通信
相关推荐
丶玉面小蛟龙3 小时前
DGCNN网络学习
学习·点云·dgcnn
小小、码农3 小时前
Linux进程概念
linux·服务器·网络
JJJennie7773 小时前
当AI开始学会欺骗
网络·人工智能
晓梦林9 小时前
BUUCTF findKey-学习笔记
笔记·学习
0566469 小时前
agent学习Day15——SQLAlchemy 查询过滤、分页与历史列表接口
python·学习·fastapi
nxb55610 小时前
haproxy算法,ip透传,自定义haproxy错误页面
运维·服务器
炎武丶航11 小时前
汽车功能测试学习(1):FCW前方碰撞预警
功能测试·学习·汽车
神罚天下ET13 小时前
c# ACME client (补充)
开发语言·c#
黑桃小柒713 小时前
小,最终显示为TCP WINDOW FULL,TCP ZeroWindow。 仔细分析了下LWIP源码,还以为是内存管理出了问题,跟 ...
网络·网络协议·tcp/ip