当前位置: 首页 > article >正文

C# WebSocket实战:5分钟搞定实时聊天应用(附完整源码)

C# WebSocket实战5分钟构建高可靠实时聊天系统实时通信已成为现代应用的核心需求之一。想象一下当用户发送消息时对方能立即看到当股票价格波动时交易界面实时更新当多人协作编辑文档时所有改动即时同步——这些场景都离不开WebSocket技术。本文将带你从零开始用C#构建一个具备生产级可靠性的实时聊天系统。1. WebSocket核心概念与优势WebSocket协议在2011年成为国际标准RFC 6455它解决了HTTP协议在实时通信领域的根本性缺陷。传统HTTP通信就像打电话——每次交流都需要重新拨号而WebSocket则像保持通话状态的对讲机。关键优势对比特性WebSocketHTTP轮询连接方式单次TCP连接持久化每次请求新建连接延迟毫秒级取决于轮询间隔(通常≥1秒)带宽消耗仅消息体少量帧头每次携带完整HTTP头通信方向全双工半双工服务器推送能力原生支持需要hack实现(如长轮询)在C#生态中System.Net.WebSockets命名空间提供了原生支持。最新.NET 8进一步优化了以下方面HTTP/2 WebSocket支持RFC 8441改进的压缩算法RFC 7692增强的心跳检测机制KeepAlive2. 五分钟快速实现2.1 服务端搭建首先创建ASP.NET Core空项目添加WebSocket中间件// Program.cs var builder WebApplication.CreateBuilder(args); var app builder.Build(); app.UseWebSockets(new WebSocketOptions { KeepAliveInterval TimeSpan.FromSeconds(30), ReceiveBufferSize 4 * 1024 }); var connections new ConcurrentDictionarystring, WebSocket(); app.Map(/ws, async context { if (context.WebSockets.IsWebSocketRequest) { var ws await context.WebSockets.AcceptWebSocketAsync(); var connId Guid.NewGuid().ToString(); connections.TryAdd(connId, ws); await HandleMessages(ws, connId, connections); } else { context.Response.StatusCode 400; } }); async Task HandleMessages(WebSocket ws, string connId, ConcurrentDictionarystring, WebSocket connections) { var buffer new byte[1024 * 4]; try { while (ws.State WebSocketState.Open) { var result await ws.ReceiveAsync(new ArraySegmentbyte(buffer), CancellationToken.None); if (result.MessageType WebSocketMessageType.Text) { var message Encoding.UTF8.GetString(buffer, 0, result.Count); await BroadcastMessage(${connId}: {message}, connections); } else if (result.MessageType WebSocketMessageType.Close) { await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, null, CancellationToken.None); connections.TryRemove(connId, out _); } } } catch { connections.TryRemove(connId, out _); await ws.CloseAsync(WebSocketCloseStatus.InternalServerError, null, CancellationToken.None); } } async Task BroadcastMessage(string message, ConcurrentDictionarystring, WebSocket connections) { var buffer Encoding.UTF8.GetBytes(message); foreach (var (_, ws) in connections) { if (ws.State WebSocketState.Open) { await ws.SendAsync(new ArraySegmentbyte(buffer), WebSocketMessageType.Text, true, CancellationToken.None); } } } app.Run();2.2 客户端实现创建控制台客户端项目using System.Net.WebSockets; var ws new ClientWebSocket(); await ws.ConnectAsync(new Uri(ws://localhost:5000/ws), CancellationToken.None); // 接收消息线程 _ Task.Run(async () { var buffer new byte[1024 * 4]; while (true) { var result await ws.ReceiveAsync(new ArraySegmentbyte(buffer), CancellationToken.None); if (result.MessageType WebSocketMessageType.Text) { Console.WriteLine($收到: {Encoding.UTF8.GetString(buffer, 0, result.Count)}); } else if (result.MessageType WebSocketMessageType.Close) { break; } } }); // 发送消息 while (true) { var input Console.ReadLine(); if (string.IsNullOrEmpty(input)) continue; var bytes Encoding.UTF8.GetBytes(input); await ws.SendAsync(new ArraySegmentbyte(bytes), WebSocketMessageType.Text, true, CancellationToken.None); }3. 生产级优化策略3.1 心跳检测机制防止因网络问题导致僵尸连接// 服务端配置 app.UseWebSockets(new WebSocketOptions { KeepAliveInterval TimeSpan.FromSeconds(10), KeepAliveTimeout TimeSpan.FromSeconds(5) // .NET 9新增 }); // 客户端配置 ws.Options.KeepAliveInterval TimeSpan.FromSeconds(10); ws.Options.KeepAliveTimeout TimeSpan.FromSeconds(5);3.2 消息压缩减少带宽消耗注意安全风险ws.Options.DangerousDeflateOptions new WebSocketDeflateOptions { ClientMaxWindowBits 10, ServerMaxWindowBits 10, DisableCompression false // 敏感数据应设为true };3.3 安全加固// 限制消息大小 app.UseWebSockets(new WebSocketOptions { ReceiveBufferSize 4 * 1024, // 4KB AllowedOrigins { https://yourdomain.com } }); // 添加认证 app.Map(/ws, async context { if (!context.User.Identity?.IsAuthenticated ?? false) { context.Response.StatusCode 401; return; } // ...其余代码 });4. 高级功能实现4.1 二进制消息传输// 发送图片示例 var imageBytes await File.ReadAllBytesAsync(photo.jpg); await ws.SendAsync(new ArraySegmentbyte(imageBytes), WebSocketMessageType.Binary, true, CancellationToken.None); // 接收处理 if (result.MessageType WebSocketMessageType.Binary) { await File.WriteAllBytesAsync($received_{DateTime.Now.Ticks}.jpg, buffer[..result.Count]); }4.2 房间分组广播// 使用ConcurrentDictionary管理房间 var rooms new ConcurrentDictionarystring, ListWebSocket(); // 加入房间 rooms.AddOrUpdate(room1, new ListWebSocket { ws }, (_, list) { list.Add(ws); return list; }); // 房间广播 foreach (var socket in rooms[room1]) { if (socket.State WebSocketState.Open) { await socket.SendAsync(/*...*/); } }4.3 性能监控指标// 添加指标收集 var metrics new WebSocketMetrics(); app.Use(async (context, next) { var stopwatch Stopwatch.StartNew(); await next(); stopwatch.Stop(); metrics.LogConnectionDuration(stopwatch.Elapsed); }); class WebSocketMetrics { private long _totalMessages; private long _activeConnections; public void LogMessage() Interlocked.Increment(ref _totalMessages); public void LogConnection() Interlocked.Increment(ref _activeConnections); public void LogDisconnection() Interlocked.Decrement(ref _activeConnections); }5. 故障排查与调试常见问题解决方案连接立即断开检查服务端AcceptWebSocketAsync是否在中间件中正确调用验证CORS配置如需跨域大消息传输失败调整ReceiveBufferSize默认4KB分片处理多帧消息while (!result.EndOfMessage) { result await ws.ReceiveAsync(/*...*/); // 拼接buffer... }内存泄漏预防确保所有连接最终从集合中移除实现IDisposable正确释放资源// 连接清理示例 finally { connections.TryRemove(connId, out _); ws.Dispose(); }调试工具推荐Wireshark过滤websocket协议Chrome开发者工具中的WebSocket帧检查ASP.NET Core的日志系统设置LogLevel.WebSockets为Debug通过本文的实践你不仅掌握了WebSocket的基础用法还了解了生产环境所需的各项优化措施。在实际项目中建议结合SignalR等高级库简化开发它们内置了这些最佳实践。

相关文章:

C# WebSocket实战:5分钟搞定实时聊天应用(附完整源码)

C# WebSocket实战:5分钟构建高可靠实时聊天系统 实时通信已成为现代应用的核心需求之一。想象一下,当用户发送消息时,对方能立即看到;当股票价格波动时,交易界面实时更新;当多人协作编辑文档时,…...

ATOM-PRINTER嵌入式热敏打印固件深度解析

1. ATOM-PRINTER 嵌入式打印库深度解析与工程实践指南ATOM-PRINTER 是 M5Stack 推出的面向 ESP32 平台的轻量级嵌入式热敏打印固件库,专为 M5Stack Atom 系列微型主控模块(搭载 ESP32-WROVER-B)设计。该库并非传统意义上的“驱动层”C/C 库&a…...

1985–2024年武汉大学CLCD中国土地利用/覆被数据集(逐年30米栅格)|高精度长时序LUCC产品

🔍 数据简介 CLCD(China Land Cover Dataset) 是由武汉大学测绘遥感信息工程国家重点实验室李熙教授、李德仁院士团队基于Landsat系列卫星影像,结合深度学习与多源辅助数据(如夜间灯光、POI、道路网等)&…...

FRCRN命令行工具使用详解:从音频文件到降噪输出的完整流程

FRCRN命令行工具使用详解:从音频文件到降噪输出的完整流程 你是不是也遇到过这种情况?手头有一堆录音文件,背景里混杂着各种杂音——可能是空调的嗡嗡声、键盘的敲击声,或者是窗外的车流声。手动处理这些音频不仅费时费力&#x…...

智科毕业设计易上手选题100例

0 选题推荐 - 汇总篇 毕业设计是大家学习生涯的最重要的里程碑,它不仅是对四年所学知识的综合运用,更是展示个人技术能力和创新思维的重要过程。选择一个合适的毕业设计题目至关重要,它应该既能体现你的专业能力,又能满足实际应用…...

C语言起源发展全知道,带你了解编程界元老的辉煌历程

C言语是一种具有通用性的编程言语,在软件开发范畴被广泛运用,如操作系统、嵌入式系统、高性能服务器还有各类应用软件,它因强大功能、简洁语法以及高效性能而闻名,本文会详细介绍C言语的起源、发展进程以及其在当今编程世界里的地…...

避坑指南:OpenClaw连接Qwen3-32B镜像的5大常见错误

避坑指南:OpenClaw连接Qwen3-32B镜像的5大常见错误 1. 为什么连接Qwen3-32B镜像容易踩坑? 上周我在本地尝试用OpenClaw对接Qwen3-32B镜像时,经历了从满怀期待到怀疑人生的全过程。本以为有了官方镜像就能一键连通,结果从环境配置…...

提升90%效率:OpenCore EFI自动化配置工具OpCore-Simplify实战指南

提升90%效率:OpenCore EFI自动化配置工具OpCore-Simplify实战指南 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 副标题:面向…...

Qwen3-Embedding-4B快速上手:5分钟部署,体验119语种向量化

Qwen3-Embedding-4B快速上手:5分钟部署,体验119语种向量化 1. 认识Qwen3-Embedding-4B 1.1 什么是文本向量化? 想象你走进一家大型图书馆,面对成千上万本书籍。如果让你手动查找与"人工智能"相关的书籍,你…...

企业级邮件系统自建指南:从技术选型到生产部署

企业级邮件系统自建指南:从技术选型到生产部署 【免费下载链接】james-project James Project是一个用于电子邮件服务器的开源软件。适用于需要为其邮件基础设施提供强大和可靠的邮件传输代理的企业和组织。具有可扩展性、灵活性和易于使用的特点。 项目地址: htt…...

【开题答辩全过程】以 基于JSP框架的医疗管理系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人,语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…...

SVN检出报错大全:从E170011到E120106的实战解决手册(附cleanup的正确用法)

SVN检出报错实战指南:从E170011到E120106的深度解析与解决方案 引言:SVN检出报错的常见场景与应对思路 在团队协作开发中,版本控制系统扮演着至关重要的角色。作为集中式版本控制的代表,SVN(Subversion)至今…...

智能缓存加速:重新定义扩散模型推理效率

智能缓存加速:重新定义扩散模型推理效率 【免费下载链接】ComfyUI-TeaCache 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-TeaCache 在AI创作领域,等待成为最大的创作阻力。当你使用扩散模型生成图像或视频时,是否曾因漫长的…...

掌握Calibre电子书管理:从格式转换到高级编辑的完整指南

掌握Calibre电子书管理:从格式转换到高级编辑的完整指南 【免费下载链接】calibre The official source code repository for the calibre ebook manager 项目地址: https://gitcode.com/GitHub_Trending/ca/calibre Calibre是一款功能强大的开源电子书管理器…...

企业级二进制差异算法:bsdiff/bspatch的高效智能更新方案

企业级二进制差异算法:bsdiff/bspatch的高效智能更新方案 【免费下载链接】bsdiff bsdiff and bspatch are libraries for building and applying patches to binary files. 项目地址: https://gitcode.com/gh_mirrors/bs/bsdiff 在软件分发和持续部署领域&a…...

解锁Audacity:5个零成本音频处理功能彻底改变你的创作流程

解锁Audacity:5个零成本音频处理功能彻底改变你的创作流程 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 价值定位:为什么Audacity是音频创作者的必备工具 在音频编辑领域,专…...

Bongo Cat功能选择指南:从需求定位到场景化配置

Bongo Cat功能选择指南:从需求定位到场景化配置 【免费下载链接】BongoCat 让呆萌可爱的 Bongo Cat 陪伴你的键盘敲击与鼠标操作,每一次输入都充满趣味与活力! 项目地址: https://gitcode.com/gh_mirrors/bong/BongoCat Bongo Cat是一…...

协议数采网关在智慧水务场景中的应用与功能

水资源管理作为生态文明建设的关键组成部分,其重要性不言而喻。在智慧水务建设不断深化的当下,水质监测、水量调度以及设备运维等各个环节,都对智能化水平提出了更为严苛的要求。然而,当前水务行业面临着诸多难题,监测…...

雪女-斗罗大陆-造相Z-Turbo助力AI编程:自动生成代码片段与函数注释

雪女-斗罗大陆-造相Z-Turbo助力AI编程:自动生成代码片段与函数注释 作为一名写了十几年代码的老兵,我经历过从记事本写代码到现代IDE的整个进化史。这些年,各种提升效率的工具层出不穷,但“写代码”这件事的核心——将想法转化为…...

Phi-4-reasoning-vision-15B在金融图表分析中的实战:趋势识别与异常定位

Phi-4-reasoning-vision-15B在金融图表分析中的实战:趋势识别与异常定位 1. 金融图表分析的挑战与机遇 金融从业者每天需要分析大量图表数据,从K线图到财务报表,从趋势分析到异常检测。传统的人工分析方法存在三个明显痛点: 效…...

AI写的论文如何降到20%以内?分场景教程+工具对比

AI写的论文如何降到20%以内?分场景教程工具对比 “我用DeepSeek写了大半篇论文,导师要求知网AI率必须低于20%,现在已经是52%,我该怎么办?” 这是毕业季最典型的求助问题之一。 不同的情况,处理方法不一样。…...

手机号逆向查询QQ号:3步快速找回QQ号的终极免费方案

手机号逆向查询QQ号:3步快速找回QQ号的终极免费方案 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 你是否曾因忘记QQ号而无法登录重要账号?手机号逆向查询QQ号工具为你提供了一种简单高效的解决方案。这个基…...

避开这些坑!用MATLAB做QPSK调制解调仿真时,你的成形滤波和匹配滤波设置对了吗?

QPSK仿真中的成形滤波与匹配滤波陷阱:MATLAB实战避坑指南 在数字通信系统的设计与验证过程中,MATLAB仿真扮演着至关重要的角色。许多工程师和研究人员在QPSK调制解调仿真中,常常遇到性能不达预期或结果与理论不符的情况。本文将深入剖析成形滤…...

告别手动:Python/Shell双环境实战,让Certbot自动续期通配符证书稳如泰山

Python/Shell双环境实战:Certbot自动续期通配符证书的终极方案 当你的服务器集群同时存在Python和Shell环境时,如何构建一个统一的证书自动化管理体系?这个问题困扰着许多技术负责人。通配符证书的自动续期看似简单,但在混合技术栈…...

OpCore Simplify:开源工具驱动的OpenCore EFI高效配置技术方案

OpCore Simplify:开源工具驱动的OpenCore EFI高效配置技术方案 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 问题引入:Hacki…...

GME-Qwen2-VL-2B-Instruct效果扩展:多风格艺术画作的理解与情感分析展示

GME-Qwen2-VL-2B-Instruct效果扩展:多风格艺术画作的理解与情感分析展示 最近在玩一个挺有意思的视觉语言模型,叫GME-Qwen2-VL-2B-Instruct。它个头不大,但能力挺让人意外。我突发奇想,把它当成了一个“数字艺术评论员”&#xf…...

Minecraft Masa Mods汉化包终极指南:三分钟告别英文界面困扰

Minecraft Masa Mods汉化包终极指南:三分钟告别英文界面困扰 【免费下载链接】masa-mods-chinese 一个masa mods的汉化资源包 项目地址: https://gitcode.com/gh_mirrors/ma/masa-mods-chinese 还在为Masa Mods系列模组的英文界面而烦恼吗?每次打…...

CosyVoice-300M Lite实战案例:在线教育语音课件生成系统

CosyVoice-300M Lite实战案例:在线教育语音课件生成系统 1. 为什么在线教育需要专属语音合成系统? 你有没有遇到过这样的场景:一位初中物理老师想为“浮力原理”这节课制作配套音频讲解,但反复试了三款主流TTS工具——要么普通话…...

避坑指南:通达信指标加密的4种方法实测,哪种最难被破解?

通达信指标加密技术深度测评:从入门到防破解实战 在量化交易和个性化指标分析领域,通达信作为国内主流证券分析软件,其自定义指标功能一直备受投资者青睐。但随之而来的指标被盗用、滥用问题也让许多开发者头疼不已——一个经过数月验证的高胜…...

PicView图片浏览器完整指南:从零开始掌握高效图片管理技巧

PicView图片浏览器完整指南:从零开始掌握高效图片管理技巧 【免费下载链接】PicView Fast, free and customizable image viewer for Windows 10 and 11. 项目地址: https://gitcode.com/gh_mirrors/pi/PicView PicView是一款专为Windows 10和11设计的快速、…...