手搓C#网络通信:从心跳包到群聊室的实现

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

咱们直接进入正题,先看服务端代码。这个服务端用了异步处理,能同时接客多个客户端。注意看这个魔法方法BeginAccept,它像极了餐馆里的自动叫号机:

// 服务端核心代码(异步版) public class AsyncServer { private Socket _serverSocket; private List<Socket> _clientSockets = new List<Socket>(); // 客户池 public void Start(int port) { _serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _serverSocket.Bind(new IPEndPoint(IPAddress.Any, port)); _serverSocket.Listen(10); Console.WriteLine("服务端已启动,进入贤者模式..."); // 开始等待客人上门(非阻塞) _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); } private void AcceptCallback(IAsyncResult ar) { Socket client = _serverSocket.EndAccept(ar); _clientSockets.Add(client); Console.WriteLine($"新客户上线,当前在线:{_clientSockets.Count}"); // 给新客户配专属服务员 byte[] buffer = new byte[1024]; client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), new ClientState { Socket = client, Buffer = buffer }); // 继续蹲点等新客 _serverSocket.BeginAccept(new AsyncCallback(AcceptCallback), null); } }

重点来了:BeginAccept是异步接客的关键,不会阻塞主线程。每个新连接进来都会触发AcceptCallback,这里用了递归式等待——处理完一个立即准备接待下一个。

客户端的重连机制像个倔强的追求者,核心代码如下:

// 客户端重连模块 public class ReconnectClient { private Socket _clientSocket; private Timer _reconnectTimer; public void Connect(string ip, int port) { _clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // 开启死亡循环模式尝试连接 _reconnectTimer = new Timer(state => { try { _clientSocket.Connect(ip, port); Console.WriteLine("成功勾搭上服务端!"); StartReceiving(); // 开始接收数据 _reconnectTimer.Dispose(); // 关掉定时器 } catch { Console.WriteLine("服务端不在线,5秒后继续撩..."); } }, null, 0, 5000); // 每5秒尝试一次 } }

这个Timer相当于备胎定时器,每隔5秒就尝试连接,直到成功为止。注意finally里没有直接关闭socket,保持长连接状态。

再看数据接收的骚操作,用状态对象保存会话:

// 接收数据时的回调处理 private void ReceiveCallback(IAsyncResult ar) { ClientState state = (ClientState)ar.AsyncState; try { int bytesRead = state.Socket.EndReceive(ar); if (bytesRead > 0) { string msg = Encoding.UTF8.GetString(state.Buffer, 0, bytesRead); Console.WriteLine($"收到情报:{msg}"); // 继续监听下一波数据(像接龙游戏) state.Socket.BeginReceive(state.Buffer, 0, state.Buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveCallback), state); } } catch (SocketException ex) { Console.WriteLine($"客户失联,错误码:{ex.SocketErrorCode}"); state.Socket.Close(); _clientSockets.Remove(state.Socket); // 从客户池踢出 } } // 会话状态封装类 public class ClientState { public Socket Socket { get; set; } public byte[] Buffer { get; set; } }

这里用了ClientState对象来保存socket和buffer,避免闭包问题。异常处理中特别关注SocketException,能准确识别网络断开等状况。

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

群发消息的实现像极了小区广播:

// 服务端广播功能 public void Broadcast(string message) { byte[] data = Encoding.UTF8.GetBytes(message); foreach (var client in _clientSockets.ToArray()) // ToArray防止遍历时集合被修改 { if (client.Connected) { client.BeginSend(data, 0, data.Length, SocketFlags.None, new AsyncCallback(SendCallback), client); } else { _clientSockets.Remove(client); // 清理僵尸连接 } } }

这里用了ToArray来遍历副本,避免在迭代时修改集合导致的异常。BeginSend的异步发送不会阻塞服务端,适合高并发场景。

在VS2015中编译时要注意:项目属性→生成→目标框架要选.NET 4.5以上,确保Socket异步API可用。如果遇到SocketException 10054错误,那是客户端异常断线的正常反馈,咱们已经在接收回调里处理了。

最后来个心跳包检测存活的小技巧:

// 心跳检测 private void StartHeartbeat() { Timer heartbeatTimer = new Timer(state => { foreach (var client in _clientSockets.ToArray()) { if (!client.Poll(1000, SelectMode.SelectRead)) // 检测连接状态 { Console.WriteLine("检测到僵尸连接,执行清理"); client.Close(); _clientSockets.Remove(client); } } }, null, 60000, 60000); // 每分钟检测一次 }

Poll方法能准确判断TCP连接的实际状态,比单纯判断Connected属性更可靠。这个定时器像扫地机器人,定期清理失效连接。

把这些模块组装起来,你就得到了一个支持异步通信、自动重连、多客户端管理的聊天服务器。代码已通过VS2015编译测试,直接拉取代码后记得修改IP和端口参数。完整源码在Github的SocketChatRoom项目中,注释详细到每个方法都有使用示例,保证你半小时内就能魔改成自己的通信框架。

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

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

相关文章

模型缓存位置在哪?FSMN-VAD存储路径配置详解

模型缓存位置在哪&#xff1f;FSMN-VAD存储路径配置详解 1. FSMN-VAD 离线语音端点检测控制台 你是否在使用 FSMN-VAD 做语音检测时&#xff0c;遇到模型下载慢、路径混乱、重复加载的问题&#xff1f;其实关键就在于——模型缓存位置没搞清楚。 本文将带你彻底搞懂 FSMN-VA…

无需画框,输入文字即可分割!SAM3大模型镜像全面解读

无需画框&#xff0c;输入文字即可分割&#xff01;SAM3大模型镜像全面解读 你是否还在为图像分割中繁琐的手动画框而烦恼&#xff1f;是否希望AI能听懂你的“一句话指令”&#xff0c;自动把图中的目标精准抠出来&#xff1f;现在&#xff0c;这一切已经不再是幻想。 CSDN星…

基于DeepSeek-OCR-WEBUI的多语言文字识别实践|轻量快速,中文准确率高

基于DeepSeek-OCR-WEBUI的多语言文字识别实践&#xff5c;轻量快速&#xff0c;中文准确率高 1. 为什么你需要一个真正好用的OCR工具&#xff1f; 你有没有遇到过这些场景&#xff1a; 手里有一张发票照片&#xff0c;想把金额、税号、开票日期快速复制进财务系统&#xff0…

Qwen部署显存不足?0.5B超轻模型CPU适配实战解决

Qwen部署显存不足&#xff1f;0.5B超轻模型CPU适配实战解决 1. 为什么你的Qwen跑不起来&#xff1f;显存瓶颈的真实写照 你是不是也遇到过这种情况&#xff1a;兴致勃勃想本地部署一个大模型&#xff0c;结果刚一启动就提示“CUDA out of memory”&#xff1f;明明是冲着通义…

科哥打造的Seaco Paraformer镜像,中文识别准确率真高

科哥打造的Seaco Paraformer镜像&#xff0c;中文识别准确率真高 1. 快速上手&#xff1a;科哥版Seaco Paraformer语音识别有多强&#xff1f; 你有没有遇到过这样的情况&#xff1a;会议录音听写要花几个小时&#xff0c;客服录音分析效率低&#xff0c;专业术语总是识别错&…

开发者首选!GPEN人像修复镜像免配置环境部署教程

开发者首选&#xff01;GPEN人像修复镜像免配置环境部署教程 你是否还在为搭建深度学习环境而烦恼&#xff1f;尤其是面对复杂的人像修复模型&#xff0c;安装依赖、配置CUDA、调试版本兼容问题常常让人头大。今天&#xff0c;我们带来一个真正“开箱即用”的解决方案——GPEN…

FST ITN-ZH核心功能解析|附WebUI批量转换实战案例

FST ITN-ZH核心功能解析&#xff5c;附WebUI批量转换实战案例 在日常处理中文文本时&#xff0c;我们常常会遇到大量非标准化的表达形式&#xff1a;比如“二零零八年八月八日”、“早上八点半”、“一百二十三”等。这些口语化或书面变体虽然便于人类理解&#xff0c;但在数据…

HY-MT1.5-7B大模型镜像上线|支持术语干预与上下文翻译,适配复杂场景

HY-MT1.5-7B大模型镜像上线&#xff5c;支持术语干预与上下文翻译&#xff0c;适配复杂场景 你是否遇到过这样的问题&#xff1a;技术文档里夹杂大量专业术语&#xff0c;机器翻译直接“自由发挥”&#xff0c;把“Transformer层归一化”翻成“变形金刚的标准化”&#xff1b;…

告别繁琐配置!Z-Image-Turbo开箱即用实测分享

告别繁琐配置&#xff01;Z-Image-Turbo开箱即用实测分享 你有没有经历过这样的时刻&#xff1a;兴致勃勃想用AI画一张图&#xff0c;结果卡在下载模型、配置环境、解决依赖冲突上&#xff0c;折腾半天还没看到第一张图像&#xff1f;更别说那些动辄几十步推理、显存吃紧、中文…

2026年优秀弹力绳制造厂报价深度测评:技术、服务与价值的综合较量

【开头引言】 弹力绳,作为现代工业、运动健身、航海作业乃至应急救援中不可或缺的基础耗材与功能组件,其性能的优劣直接影响着终端产品的可靠性与用户体验。从简单的橡胶条到如今融合了高分子材料学、精密编织工艺与…

Sambert与ModelScope集成:模型托管调用实战指南

Sambert与ModelScope集成&#xff1a;模型托管调用实战指南 1. 开箱即用的多情感中文语音合成体验 你有没有遇到过这样的场景&#xff1a;想为一段文案配上自然流畅的中文语音&#xff0c;却苦于找不到合适的发音人&#xff1f;或者需要为不同角色设计不同情绪的声音&#xf…

2026年大模型后训练趋势:verl开源框架+弹性GPU部署详解

2026年大模型后训练趋势&#xff1a;verl开源框架弹性GPU部署详解 1. verl 介绍 verl 是一个灵活、高效且可用于生产环境的强化学习&#xff08;RL&#xff09;训练框架&#xff0c;专为大型语言模型&#xff08;LLMs&#xff09;的后训练设计。它由字节跳动火山引擎团队开源…

Qwen-Image-2512降本部署案例:单卡4090D实现高效出图,成本省50%

Qwen-Image-2512降本部署案例&#xff1a;单卡4090D实现高效出图&#xff0c;成本省50% 1. 引言&#xff1a;为什么这个部署方案值得关注&#xff1f; 你是不是也遇到过这样的问题&#xff1a;想用高质量AI生成图片&#xff0c;但动辄需要多张A100、H100显卡&#xff0c;部署…

Linux新手福音:测试镜像简化开机启动配置流程

Linux新手福音&#xff1a;测试镜像简化开机启动配置流程 1. 为什么你需要关注开机启动脚本 你有没有遇到过这样的情况&#xff1a;服务器突然断电重启&#xff0c;结果服务没自动起来&#xff0c;网站打不开、接口全挂&#xff0c;只能手动登录一台台去启动&#xff1f;对于…

YOLO11实战案例:工业质检系统搭建详细步骤

YOLO11实战案例&#xff1a;工业质检系统搭建详细步骤 YOLO11是Ultralytics公司推出的最新目标检测算法&#xff0c;作为YOLO系列的最新迭代版本&#xff0c;在精度、速度和模型轻量化方面实现了新的突破。相比前代模型&#xff0c;YOLO11在保持高推理速度的同时&#xff0c;显…

亲测NewBie-image-Exp0.1:3.5B参数模型带来的惊艳动漫效果

亲测NewBie-image-Exp0.1&#xff1a;3.5B参数模型带来的惊艳动漫效果 最近在尝试几个开源的动漫图像生成项目时&#xff0c;偶然接触到一个名为 NewBie-image-Exp0.1 的预置镜像。说实话&#xff0c;一开始只是抱着“试试看”的心态&#xff0c;没想到实际体验下来完全超出预…

Paraformer-large结合Elasticsearch:语音内容检索系统构建

Paraformer-large结合Elasticsearch&#xff1a;语音内容检索系统构建 1. 系统背景与核心价值 你有没有遇到过这种情况&#xff1a;手头有几十小时的会议录音、讲座音频或客服对话&#xff0c;想找某一句“刚才领导说的那个指标是多少”&#xff0c;却只能一遍遍拖动进度条重…

Llama3-8B微调过拟合?早停策略与验证集设置

Llama3-8B微调过拟合&#xff1f;早停策略与验证集设置 1. 为什么你的Llama3-8B微调会过拟合&#xff1f; 你有没有遇到这种情况&#xff1a;用 Llama3-8B 微调时&#xff0c;训练损失一路下降&#xff0c;模型在训练集上表现越来越好&#xff0c;但一到实际对话中就“答非所…

AI抠图避坑指南:科哥WebUI镜像常见问题全解析

AI抠图避坑指南&#xff1a;科哥WebUI镜像常见问题全解析 1. 为什么这款AI抠图工具值得你关注&#xff1f; 在电商、设计、内容创作等领域&#xff0c;图像去背景是一项高频且耗时的任务。传统修图方式依赖人工操作&#xff0c;效率低、成本高&#xff0c;尤其面对发丝、透明…

Open-AutoGLM效果惊艳!AI自动操作手机全流程演示

Open-AutoGLM效果惊艳&#xff01;AI自动操作手机全流程演示 TOC 1. 引言&#xff1a;当AI开始“动手”操作你的手机 你有没有想过&#xff0c;有一天只需要说一句话&#xff0c;比如“帮我点一份附近评分最高的川菜外卖”&#xff0c;然后你的手机就自己打开美团、搜索餐厅、…