news 2026/5/2 15:31:39

C# Socket 通信:异步、同步与断线重连

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C# Socket 通信:异步、同步与断线重连

1、C#Socket异步、同步通信服务端、客户端源码; 2、断线重连(服务端或客户端没有启动顺序要求,先开启的等待另一端连接);3、服务端支持同时连接多个客户端;4、阅读代码就明白通信道理,注释详细; 5、VS2015编译通过。

在网络编程中,Socket 通信是非常重要的一部分。今天咱们就来聊聊如何用 C# 实现 Socket 的异步、同步通信,并且包含断线重连功能,服务端还得支持多个客户端同时连接。整个代码基于 VS2015 编译通过。

服务端代码及分析

同步通信服务端

using System; using System.Net; using System.Net.Sockets; using System.Text; class SyncServer { private TcpListener _tcpListener; private const int BufferSize = 1024; public SyncServer() { // 初始化TcpListener,监听本地11000端口 _tcpListener = new TcpListener(IPAddress.Any, 11000); _tcpListener.Start(); Console.WriteLine("同步服务端已启动,等待客户端连接..."); } public void StartAccepting() { while (true) { // 同步接受客户端连接,这里会阻塞,直到有客户端连接进来 TcpClient client = _tcpListener.AcceptTcpClient(); Console.WriteLine("有新客户端连接:" + ((IPEndPoint)client.Client.RemoteEndPoint).Address); // 处理客户端通信 HandleClient(client); } } private void HandleClient(TcpClient client) { NetworkStream stream = client.GetStream(); byte[] buffer = new byte[BufferSize]; int bytesRead; // 从客户端读取数据,这里也是同步操作,会阻塞 while ((bytesRead = stream.Read(buffer, 0, buffer.Length))!= 0) { string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("收到客户端消息:" + message); // 给客户端回消息 string response = "服务端已收到你的消息:" + message; byte[] responseBuffer = Encoding.UTF8.GetBytes(response); stream.Write(responseBuffer, 0, responseBuffer.Length); } client.Close(); } }

异步通信服务端

using System; using System.Net; using System.Net.Sockets; using System.Text; class AsyncServer { private TcpListener _tcpListener; private const int BufferSize = 1024; public AsyncServer() { _tcpListener = new TcpListener(IPAddress.Any, 11001); _tcpListener.Start(); Console.WriteLine("异步服务端已启动,等待客户端连接..."); // 开始异步接受客户端连接 BeginAccept(); } private void BeginAccept() { _tcpListener.BeginAcceptTcpClient(AcceptCallback, null); } private void AcceptCallback(IAsyncResult ar) { TcpClient client = _tcpListener.EndAcceptTcpClient(ar); Console.WriteLine("有新客户端连接:" + ((IPEndPoint)client.Client.RemoteEndPoint).Address); // 开始异步读取客户端数据 NetworkStream stream = client.GetStream(); byte[] buffer = new byte[BufferSize]; stream.BeginRead(buffer, 0, buffer.Length, ReadCallback, new StateObject { Client = client, Stream = stream, Buffer = buffer }); // 继续接受下一个客户端连接 BeginAccept(); } private void ReadCallback(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; TcpClient client = state.Client; NetworkStream stream = state.Stream; byte[] buffer = state.Buffer; int bytesRead = stream.EndRead(ar); if (bytesRead > 0) { string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("收到客户端消息:" + message); // 给客户端回消息 string response = "服务端已收到你的消息:" + message; byte[] responseBuffer = Encoding.UTF8.GetBytes(response); stream.BeginWrite(responseBuffer, 0, responseBuffer.Length, null, null); // 继续读取下一次数据 stream.BeginRead(buffer, 0, buffer.Length, ReadCallback, state); } else { client.Close(); } } private class StateObject { public TcpClient Client { get; set; } public NetworkStream Stream { get; set; } public byte[] Buffer { get; set; } } }

服务端代码分析

  1. 同步服务端:使用TcpListener监听指定端口。AcceptTcpClient方法是同步的,会阻塞线程直到有客户端连接。处理客户端通信也是同步的,Read方法会阻塞等待客户端发送数据。这种方式简单直接,但在处理多个客户端时性能不佳,因为同一时间只能处理一个客户端的请求。
  2. 异步服务端:同样使用TcpListener,但通过BeginAcceptTcpClientEndAcceptTcpClient实现异步接受客户端连接。异步读取数据时,使用BeginReadEndRead,并且通过StateObject类来传递状态信息,这样可以在回调中继续处理客户端数据,不会阻塞主线程,能同时处理多个客户端连接。

客户端代码及分析

同步通信客户端

using System; using System.Net.Sockets; using System.Text; class SyncClient { private TcpClient _tcpClient; private const string ServerIp = "127.0.0.1"; private const int ServerPort = 11000; private const int BufferSize = 1024; public SyncClient() { Connect(); } private void Connect() { while (true) { try { _tcpClient = new TcpClient(ServerIp, ServerPort); Console.WriteLine("已连接到服务端"); break; } catch (SocketException) { Console.WriteLine("连接失败,5秒后重试..."); System.Threading.Thread.Sleep(5000); } } } public void SendMessage(string message) { NetworkStream stream = _tcpClient.GetStream(); byte[] buffer = Encoding.UTF8.GetBytes(message); stream.Write(buffer, 0, buffer.Length); byte[] responseBuffer = new byte[BufferSize]; int bytesRead = stream.Read(responseBuffer, 0, responseBuffer.Length); string response = Encoding.UTF8.GetString(responseBuffer, 0, bytesRead); Console.WriteLine("收到服务端响应:" + response); } }

异步通信客户端

using System; using System.Net.Sockets; using System.Text; class AsyncClient { private TcpClient _tcpClient; private const string ServerIp = "127.0.0.1"; private const int ServerPort = 11001; private const int BufferSize = 1024; public AsyncClient() { Connect(); } private void Connect() { while (true) { try { _tcpClient = new TcpClient(); _tcpClient.BeginConnect(ServerIp, ServerPort, ConnectCallback, _tcpClient); break; } catch (SocketException) { Console.WriteLine("连接失败,5秒后重试..."); System.Threading.Thread.Sleep(5000); } } } private void ConnectCallback(IAsyncResult ar) { TcpClient client = (TcpClient)ar.AsyncState; client.EndConnect(ar); Console.WriteLine("已连接到服务端"); NetworkStream stream = client.GetStream(); byte[] buffer = new byte[BufferSize]; stream.BeginRead(buffer, 0, buffer.Length, ReadCallback, new StateObject { Client = client, Stream = stream, Buffer = buffer }); } public void SendMessage(string message) { NetworkStream stream = _tcpClient.GetStream(); byte[] buffer = Encoding.UTF8.GetBytes(message); stream.BeginWrite(buffer, 0, buffer.Length, null, null); } private void ReadCallback(IAsyncResult ar) { StateObject state = (StateObject)ar.AsyncState; TcpClient client = state.Client; NetworkStream stream = state.Stream; byte[] buffer = state.Buffer; int bytesRead = stream.EndRead(ar); if (bytesRead > 0) { string response = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine("收到服务端响应:" + response); stream.BeginRead(buffer, 0, buffer.Length, ReadCallback, state); } else { client.Close(); } } private class StateObject { public TcpClient Client { get; set; } public NetworkStream Stream { get; set; } public byte[] Buffer { get; set; } } }

客户端代码分析

  1. 同步客户端Connect方法中使用循环尝试连接服务端,如果连接失败就等待 5 秒后重试,实现了断线重连。SendMessage方法同步发送消息并接收服务端响应。
  2. 异步客户端Connect方法通过BeginConnectEndConnect实现异步连接,连接成功后开始异步读取服务端数据。SendMessage方法异步发送消息。断线重连也是通过循环尝试连接实现的。

通过这些代码,咱们就实现了 C# Socket 的异步、同步通信,并且服务端支持多个客户端连接,客户端和服务端都具备断线重连功能,希望对大家理解 Socket 通信有所帮助。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 2:12:57

探索之旅:基于.net 6 的多功能自用工具开发

这是一个使用.net 6 基于wpf 、OpencvSharp(opencv的.net wrapper)、ReactiveUI等开发的自用工具,主要用来做ReactiveUI与OpencvSharp学习过程中的尝试以及opencv算子参数的调试等,该程序还可以显示3D点云数据(目前程序中的点云数据是由格雷码条纹拍摄的…

作者头像 李华
网站建设 2026/4/25 11:37:22

RISE with SAP 加速落地:2027 大限将至,云 ERP 迁移进入冲刺阶段

随着 2027 年 SAP ECC 维护终止期限临近,企业的 SAP 云 ERP 迁移正在明显提速。SAPinsider 最新发布的《RISE with SAP 2025 基准报告》显示,SAP S/4HANA Cloud Private(私有云)已成为当前最重要的迁移路径之一,越来越…

作者头像 李华
网站建设 2026/4/30 10:52:49

Thinkphp的中青年人员招聘平台的设计与实现

目录摘要项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要 针对当前中青年就业市场需求与信息化管理需求,设计并实现基于ThinkPHP框架的中青年人员招聘平台。该平台采用B/S架构,整合企业招聘与个人求职功能,…

作者头像 李华
网站建设 2026/4/23 18:44:05

Thinkphp的云南省旅游景点信息平台设计与实现

目录 摘要 项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理 摘要 随着云南省旅游业的快速发展,传统旅游信息管理方式已无法满足游客和景区的高效互动需求。基于ThinkPHP框架设计的云南省旅游景点信息平台,旨在整合分散的旅…

作者头像 李华
网站建设 2026/4/24 9:52:58

Thinkphp的学生身体素质测评管理系统 个人健康bmi三高检测系统

目录摘要项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要 该系统基于ThinkPHP框架开发,旨在为学生提供全面的身体素质测评与健康管理服务。系统整合BMI(身体质量指数)计算、三高(高血压、高血糖…

作者头像 李华
网站建设 2026/4/29 14:49:04

【计算机毕业设计案例】基于python卷积神经网络CNN的不同瓶子识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华