C# WinForms TCP Socket 客户端
2026/8/4 5:08:20 网站建设 项目流程

一、客户端核心思路

TCP 通信分为服务端客户端

  • 服务端:Bind 绑定端口 → Listen 监听 → Accept 等待连接(被动)
  • 客户端:主动发起连接,不需要 Bind、不需要 Listen、不需要 Accept。 客户端 Socket 只做两件事:连接服务端 + 收发数据

二、代码整体结构说明

窗体控件:

  • button1:连接服务器按钮
  • button2:发送数据按钮
  • textBox1:输入待发送文本
  • label1:状态提示文本 全局变量:Socket client;客户端套接字对象

三、连接服务器(button1_Click)核心代码解析

private async void button1_Click(object sender, EventArgs e) { try { //1. 创建TCP客户端Socket client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2. 构造服务端终端(服务端IP + 端口) IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.219.30"), 63323); //3. 异步连接服务端 await client.ConnectAsync(endPoint); label1.Text = "连接成功"; button1.Enabled = false; button2.Enabled = true; } catch (Exception) { MessageBox.Show("服务器未打开"); return; } }

关键知识点

  1. Socket 构造参数和服务端完全一致AddressFamily.InterNetwork(IPv4)、SocketType.Stream、ProtocolType.Tcp
  2. IPEndPoint:填写服务端的 IP 地址与端口,必须和服务端 Bind 的端口一致

⚠️ IP 地址需要修改为服务端电脑实际 IP,端口号必须一致(63323)

  1. 两种连接方式对比
  • client.Connect(endPoint)同步连接,阻塞 UI 线程,界面会卡死
  • await client.ConnectAsync(endPoint)异步连接,搭配 async void,不卡住窗体,推荐写法
  1. 连接成功后控件状态切换: 禁用【连接按钮】,启用【发送按钮】,防止重复连接。
  2. 异常捕获:无法连接时弹出提示,常见原因:
    • 服务端程序没有启动
    • IP / 端口填写错误
    • 防火墙拦截
    • 两台电脑不在同一局域网

四、发送数据(button2_Click)核心代码解析

private void button2_Click(object sender, EventArgs e) { // 校验1:判断客户端是否有效、是否处于连接状态 if (client == null || !client.Connected) { MessageBox.Show("还没连接到服务器,请先连接服务器"); return; } // 校验2:判断发送内容不能为空 if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show("发送数据不能为空"); return; } try { //字符串 → UTF8字节数组 byte[] data = Encoding.UTF8.GetBytes(textBox1.Text); client.Send(data); label1.Text = "发送成功"; } catch (Exception) { label1.Text = "发送失败"; //连接断开,释放资源 if (client != null) { if (client.Connected) client.Shutdown(SocketShutdown.Both); client.Close(); client.Dispose(); } button1.Enabled = true; button2.Enabled = false; } }

关键知识点

  1. 网络只能传输字节数组 byte []发送流程:字符串 →Encoding.UTF8.GetBytes()→ byte [] 服务端接收后反向转换:byte [] →Encoding.UTF8.GetString()→ 字符串
  2. client.Send(byte[]):向服务端发送字节数据
  3. 前置校验非常重要
    • 防止未建立连接就调用 Send,直接报错崩溃
    • 禁止发送空数据
  4. 发送失败资源回收逻辑当发送异常(网络断开、服务端下线):
client.Shutdown(SocketShutdown.Both); //关闭读写通道 client.Close(); //关闭套接字 client.Dispose(); //释放内存资源

SocketShutdown.Both:同时禁止读取和写入。 回收完成后恢复按钮状态,允许用户重新连接。

五、客户端与服务端代码差异对比📌

表格

功能TCP 服务端TCP 客户端
Bind 绑定✅ 需要绑定本机 IP 端口❌ 不需要 Bind
Listen 监听✅ 需要❌ 不需要
Accept 接收连接✅ 需要循环等待客户端❌ 不需要
Connect 连接❌ 不需要✅ 主动 Connect/ConnectAsync
Socket 作用server 套接字专门等待连接,通信交给 client 套接字唯一 client 套接字,同时负责收发

六、当前代码存在的缺陷(重点记录)⚠️

  1. 缺少接收服务端消息的逻辑当前客户端只能发送,不能接收服务端下发的数据。需要新增循环 Receive 线程监听服务端推送消息。
  2. IP 地址硬编码代码里直接写死192.168.219.30,优化方案:使用文本框让用户手动输入服务端 IP。
  3. 异常处理笼统只捕获全部 Exception,无法区分:连接超时、端口不可达、网络中断等不同错误,调试不方便。
  4. 没有心跳检测无法实时感知连接是否意外断开(比如网线拔掉),只有发送数据时才会触发异常。
  5. 连接成功后,重复点击连接按钮没有拦截依靠按钮 Enabled 控制,若代码异常导致按钮状态错乱,可以重复创建 Socket,造成资源泄漏。
  6. 发送没有异步版本client.Send()是同步方法,大数据发送时可能短暂卡顿界面;高级写法使用SendAsync

七、核心方法速查表

表格

方法作用
Socket.ConnectAsync(IPEndPoint)异步主动连接服务端(推荐)
Socket.Connect(IPEndPoint)同步连接,阻塞界面
Socket.Send(byte[])发送字节数据到远端
Socket.Shutdown(SocketShutdown.Both)关闭套接字读写通道
Socket.Close()关闭套接字
Socket.Dispose()释放套接字占用系统资源
client.Connected判断套接字当前是否处于连接状态

八、完整通信联调流程(服务端 + 客户端)

  1. 启动【服务端程序】,服务端完成 Bind、Listen,开启监听
  2. 启动【客户端程序】,点击【连接服务器】
  3. 客户端 ConnectAsync 成功,提示 “连接成功”
  4. 客户端文本框输入内容,点击发送
  5. 服务端接收字节数据,转换成字符串展示在富文本框

九、拓展补充

  1. 局域网通信注意事项
  • 两台电脑连接同一个 WiFi / 局域网
  • 关闭系统防火墙,或者放行程序
  • 使用ipconfig查询服务端本机 IPv4 地址
  1. 同步与异步选择 WinForms 窗体项目,网络操作优先使用Async异步方法,避免 UI 界面卡死。
  2. 完整通信模型 标准双向通信: 服务端:接收客户端消息 + 向客户端发送消息 客户端:发送消息 +循环接收服务端消息(当前代码缺失这部分)
public partial class Form1 : Form { public Form1() { InitializeComponent(); } Socket client; //开始链结 private async void button1_Click(object sender, EventArgs e) { try { //1.创建客户端实例 client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //2.创建终端 IPEndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.219.30"),63323); //3.开始连接服务器 //client.Connect(endPoint);//同步链接 await client.ConnectAsync(endPoint);//等待异步连接结果 label1.Text = "连接成功"; button1.Enabled = false; button2.Enabled = true; } catch(Exception) { MessageBox.Show("服务器未打开"); return; } } //发送 private void button2_Click(object sender, EventArgs e) { if (client == null || !client.Connected) { MessageBox.Show("还没连接到服务器,请先连接服务器"); return; } if (string.IsNullOrEmpty(textBox1.Text)) { MessageBox.Show("发送数据不能为空"); return; } //发送数据 try { byte[] data = Encoding.UTF8.GetBytes(textBox1.Text); client.Send(data);//发送数据 label1.Text = "发送成功"; } catch (Exception) { label1.Text = "发送失败"; if (client != null) //客户端不等于空 { if (client.Connected) client.Shutdown(SocketShutdown.Both);//客户端还处于连接状态 关闭连接 client.Close();//关闭客户端 client.Dispose();//释放资源 } button1.Enabled = true; button2.Enabled = false; } } }

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

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

立即咨询