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 通信有所帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1131816.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【 n8n解惑】如何在 n8n 里同时操作数据库和调用外部 API,完成混合计算?

在 n8n 中构建混合计算工作流:整合数据库与外部 API 赋能机器学习应用 目录 引言与背景原理解释10分钟快速上手代码实现与工程要点应用场景与案例实验设计与结果分析性能分析与技术对比消融研究与可解释性可靠性、安全与合规工程化与生产部署常见问题与解决方案创…

排水管网水质监测系统:确保从源头到排放的全流程水质管控

随着城市化进程加快,排水管网的水质安全直接关系到公共卫生和生态平衡。排水管网水质监测系统通过实时采集、分析水体关键指标,为市政管理提供科学决策依据。这套集成了传感器技术、物联网传输和智能分析功能的系统,正在成为现代城市水务管理…

高性价比升降机品牌推荐,让厨房高处空间触手可及的智能解决方案

面对厨房高处橱柜,你是否也曾经历这些困扰?踮脚够不着、搬凳子太危险、柜子深处物品被遗忘……传统吊柜的空间利用率低,取放不便已成为现代厨房的普遍痛点。升降机(又称升降拉篮)的出现,彻底改变了这一局面…

P6KE160A单向 TVS瞬态抑制二极管:3000W工业级瞬态屏障,精准守护160V敏感电路

P6KE160A单向 TVS瞬态抑制二极管 二极管产品已经跟我们的生活有着密不可分的联系了, TVS瞬态抑制二极管,是一种高效能保护二极管,产品体积小、功率大、响应快等诸多优点,产品应用广泛 TVS瞬态抑制二极管P6KE160A,是一种…

STM32步进电机:S型与SpTA加减速控制算法探秘

STM32步进电机高效S型T梯形曲线SpTA加减速控制算法 提供基于STM32的步进电机电机S型曲线控制算法以及比较流行的SpTA算法.SpTA算法具有更好的自适应性,控制效果更佳,特别适合移植在CPLD\\\\FPGA中实现对多路(有多少IO,就可以控制多…

电磁寻迹小车代码全解析:基于STM32C8T6主控

出电磁寻迹小车代码 主控stm32c8t6 提供原理图 pcb 一、引言 电磁寻迹小车在智能车竞赛等场景中有着广泛应用。以STM32C8T6为主控芯片来打造这样一辆小车,我们需要从硬件原理图、PCB设计以及代码实现等多个方面入手。今天就来和大家详细唠唠这其中的门道&#xff…

探秘产线MES系统的核心功能

产线MES系统 扫码追溯 PLC通信 数据库存储 标签打印在现代制造业的复杂产线中,MES(制造执行系统)宛如一位幕后的智慧指挥家,掌控着生产的方方面面。今天咱们就来深入聊聊产线MES系统里几个关键的功能模块:扫码追溯、PL…

非科班普通人如何转大模型相关岗位拿下大厂 offer

现在大模型的风口有多猛,不用我多说吧?相关岗位的 HC(head count,岗位编制)肉眼可见地比传统前后端要多,就算你面的是传统后端岗位,面试官也总会绕着弯子问你几个大模型的问题,考察你…

轮毂电机分布式驱动车辆状态估计:EKF 与 UKF 的实战

车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF车辆状态估计,扩展卡尔曼滤波EKF,无迹卡尔曼滤波UKF 角阶跃输入整车7自由度模型UKF状态估计模型附送EKF状态估计模型,针对于轮毂电机分布式驱动车辆,进行…

基于S7 - 200 PLC和组态王打造5种商品自动售货机

基于S7-200 PLC和组态王自动售货机5种商品售货 带解释的梯形图程序,接线图原理图图纸,io分配,组态画面在自动化控制领域,利用S7 - 200 PLC结合组态王来实现自动售货机的功能是一个很有趣且实用的项目。今天就来和大家详细分享一下…

雷军回应被指营销大师;字节跳动否认造车;传微软即将开启2026第一次大规模裁员,预计波及超万人 | 极客头条

「极客头条」—— 技术人员的新闻圈!CSDN 的读者朋友们好,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。(投稿或寻求报道:zhanghycsdn.net)整理 | 苏宓出品 | CSDN(ID&…

Z-Image-Turbo日志审计功能:生成记录追溯与合规性检查

Z-Image-Turbo日志审计功能:生成记录追溯与合规性检查 在AI图像生成系统日益广泛应用于内容创作、广告设计和数字媒体的背景下,可追溯性与合规性成为企业级部署不可忽视的核心需求。阿里通义Z-Image-Turbo WebUI作为基于DiffSynth Studio框架二次开发的…

基于总变差正则化模型的图像复原

总变差正则化(Total Variation, TV)模型是一种广泛应用于图像复原的技术,能够有效去除噪声和模糊,同时保持图像的边缘信息。 1. 总变差正则化模型的基本原理 总变差正则化模型通过最小化一个包含数据保真项和正则化项的目标函数来…

工控机的抗恶劣环境设计:高温、高湿、强电磁,如何做到稳定运行?

在工业自动化领域,工控机作为系统的控制核心,时常需要在高温、高湿、强电磁干扰等恶劣环境下稳定运行。与普通商用计算机不同,工控机采用了一系列特殊设计来应对这些挑战。本文将深入探讨工控机如何通过硬件和软件设计,在恶劣工业…

Z-Image-Turbo本地运行安全性验证报告

Z-Image-Turbo本地运行安全性验证报告 引言:AI图像生成模型的本地化安全挑战 随着生成式AI技术的快速普及,越来越多开发者和企业选择在本地环境部署AI图像生成模型,以保障数据隐私、降低云服务成本并提升响应效率。阿里通义推出的Z-Image-T…

Linux PS2 环境变量详解

Linux PS2 环境变量详解PS2 是什么?PS2(Secondary Prompt String)是 第二提示符,也称为 继续提示符。当命令输入不完整,需要继续输入时显示。何时会看到 PS2?在以下情况会显示 PS2:1. 多行命令&…

Thinkphp的校园快递仓库管理系统的设计与实现

目录校园快递仓库管理系统的设计与实现(基于ThinkPHP)项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理校园快递仓库管理系统的设计与实现(基于ThinkPHP) 针对高校快递数量激增、管理效率低下的问题&…

Linux IFS 环境变量详解

Linux IFS 环境变量详解IFS 是什么?IFS(Internal Field Separator)是 内部字段分隔符,它定义了 Shell 在**分词(word splitting)**时使用的分隔符。默认值# 默认 IFS 值(空格、制表符、换行符&a…

基于蚁群算法求解带时间窗的车辆路径问题

基于蚁群算法(ACO)求解带时间窗的车辆路径问题(VRPTW)的Matlab实现,需结合路径优化与时间窗约束,通过信息素正反馈和启发式搜索实现全局最优。一、算法框架 1. 问题定义 输入数据:客户需求坐标、…

Thinkphp的招投标系统的设计与实现

目录摘要关键词项目开发技术介绍PHP核心代码部分展示系统结论源码获取/同行可拿货,招校园代理摘要 随着互联网技术的快速发展,招投标系统逐渐向信息化、智能化方向发展。基于ThinkPHP框架的招投标系统设计旨在提高招投标过程的效率、透明度和公平性,减少…