C# Socket网络编程:基于Windows Forms的TCP服务器实现

程一诺
程一诺
发布时间:2026-10-15| 3人浏览过
原创

在C#中进行Socket网络编程时,建立稳定的TCP服务器需要处理绑定端口、监听连接、使用多线程并发服务以及管理跨线程界面更新。以下示例提供了一个基础的Windows Forms结构,演示如何创建一个简单的TCP聊天服务器。

结果或目标

构建一个基于C#和Windows Forms的网络应用程序,该程序作为TCP服务器运行,能够:
1. 在指定端口(默认5000)上监听传入的连接。
2. 接受多个客户端的同时连接。
3. 实时显示客户端IP地址和接收到的消息。
4. 支持向选定的特定客户端发送响应消息。

准备条件

  • 开发环境:Visual Studio 或其他支持C#的IDE。
  • 命名空间依赖:确保引入 System.Net.Sockets, System.Net, 和 System.Threading。
  • 网络配置:理解TCP协议的特性(如三次握手、数据完整性),以及IP地址与端口号的对应关系。

真实操作顺序

第1步:初始化窗口与基本设置

目的:定义全局变量和默认参数,为服务器运行做准备。

在窗体加载事件中,设置默认监听端口和IP地址占位符。

public Form1() {
 InitializeComponent();
 this.txtPort.Text = "5000";
 this.txtIp.Text = "192.168.137.1";
}

第2步:启动Socket监听服务

目的:创建负责监听的Socket对象,绑定IP和端口,并开始等待连接。

点击“开始监听”按钮时触发此逻辑:

  1. 创建监听Socket:使用 AddressFamily.InterNetwork, SocketType.Stream, 和 ProtocolType.Tcp 创建实例。
  2. 绑定地址:使用 IPAddress.Any 监听所有网络接口,并将用户输入或默认的端口号转换为 IPEndPoint。
  3. 开启监听:调用 Bind(point) 后,设置连接队列长度 Listen(10)。
  4. 启动后台线程:由于 Accept() 是阻塞方法,需在新线程中运行以避免冻结UI。
// 当点击开始监听的时候
Socket socketWatch = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip, Convert.ToInt32(txtPort.Text));
socketWatch.Bind(point);
ShowMsg("监听成功");
socketWatch.Listen(10);

// 处理跨线程访问问题
Control.CheckForIllegalCrossThreadCalls = false;
Thread th = new Thread(Listen);
th.IsBackground = true;
th.Start(socketWatch);

第3步:处理客户端连接请求

目的:接收新连接,并为每个客户端分配专用的通信Socket。

在 Listen 方法的无限循环中:

  1. 接受连接:调用 socketWatch.Accept(),该方法会阻塞直到有客户端连接。
  2. 记录客户端:获取远程端点(IP:Port),将其存入字典 Dictionary<string, Socket> 以供后续定向发送。
  3. 提示连接成功:更新UI日志并添加到下拉列表以便选择。
  4. 启动接收线程:为每个新连接创建一个新的后台线程来执行数据接收任务。
void Listen(object o) {
 Socket socketWatch = o as Socket;
 while (true) {
  // 等待并接收新客户端连接
  Socket socketSend = socketWatch.Accept();
  
  // 存储该客户端的通信Socket
  dic.Add(socketSend.RemoteEndPoint.ToString(), socketSend);
  ShowMsg(socketSend.RemoteEndPoint.ToString() + ":连接成功");
  comboBox1.Items.Add(socketSend.RemoteEndPoint.ToString());
  
  // 为该客户端单独启动接收线程
  Thread getdata = new Thread(GetData);
  getdata.IsBackground = true;
  getdata.Start(socketSend);
 }
}

第4步:接收客户端发送的消息

目的:在非阻塞状态下持续读取客户端发来的数据流。

在 GetData 方法中:

  1. 缓冲区准备:创建字节数组 buffer 用于暂存接收到的数据(示例中使用2MB容量)。
  2. 读取数据:调用 socketSend.Receive(buffer)。若返回值为0,说明客户端已断开,应退出当前线程循环。
  3. 解码文本:使用 Encoding.UTF8.GetString 将字节数组还原为字符串。
  4. 更新UI:将解码后的内容追加到日志文本框。
void GetData(object o) {
 Socket socketSend = o as Socket;
 while (true) {
  byte[] buffer = new byte[1024 * 1024 * 2];
  int r = socketSend.Receive(buffer);
  
  if (r == 0) break; // 客户端关闭连接
  
  string str = Encoding.UTF8.GetString(buffer, 0, r);
  ShowMsg(socketSend.RemoteEndPoint.ToString() + ":" + str);
 }
}

第5步:向指定客户端发送消息

目的:根据用户选择的客户端IP,反向发送数据。

  1. 验证选择:检查下拉框是否选中有效客户端。
  2. 获取通信Socket:从字典中提取对应的 Socket 对象。
  3. 编码并发送:将输入文本转换为UTF-8字节数组,调用 Send() 方法。
private void btnSend_Click_1(object sender, EventArgs e) {
 if (comboBox1.SelectedItem == null) {
  MessageBox.Show("请选择客户端");
  return;
 }
 string str = txtMes.Text;
 byte[] strByte = Encoding.Default.GetBytes(str); // 注意:接收端用UTF8,发送建议也统一或用Default兼容旧版
 string getIp = comboBox1.SelectedItem as string;
 Socket socketSend = dic[getIp];
 socketSend.Send(strByte);
}

完成判断

当您在控制台或另一个客户端工具(如Telnet)连接到服务器的指定IP和端口(例如 telnet 192.168.137.1 5000)时,服务器的日志区域应显示“连接成功”。随后在Telnet中输入文字并回车,服务器UI上的日志区应立即反射出该内容。反之,在服务器界面选择该客户端并点击发送,Telnet窗口应显示服务器发出的消息。

简要总结

上述代码展示了C# Socket编程的核心流程:监听、接受、分线程处理和消息编解码。在实际生产环境中,建议进一步采用异步API(如 async/await 配合 SocketAsyncEventArgs)以替代手动线程管理,提高高并发场景下的性能与稳定性。以上就是C# Socket网络编程基于Windows Forms实现的详细内容,更多关于C#网络编程技巧的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。