最近在折腾一个高性能C#服务端轮子,目标是搞个能同时扛住各种网络协议的瑞士军刀。咱这轮子就得自己撸底层,从Socket开始造轮子。先上个核心架构图镇楼

c#高性能服务器源代码,其中包括mvc api服务,http服务,ftp服务,sokect服务,websocket服务,大文件传输服务。 这些服务均抛开iis及第三支持,可写成服务或随软件启动而启动。

public class ServerHost : IDisposable { private readonly List<IService> _services = new(); public void AddService(IService service) => _services.Add(service); public void Start() { foreach (var service in _services) { service.StartListening(); } } // 省略其他方法... }

这个宿主容器负责统一管理各种服务。重点在于每个服务都要自己处理线程池和IO优化。拿HTTP服务来说,很多人第一反应是HttpListener,但那玩意儿性能天花板太低。咱们直接裸写Socket:

public class HttpServer : IService { private Socket _listener; public void StartListening() { _listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); _listener.Bind(new IPEndPoint(IPAddress.Any, 8080)); _listener.Listen(100); while (true) { var clientSocket = _listener.Accept(); ThreadPool.QueueUserWorkItem(state => { using var stream = new NetworkStream(clientSocket); // 手动解析HTTP头 var buffer = new byte[4096]; var bytesRead = stream.Read(buffer, 0, buffer.Length); // 解析请求行... // 路由处理... // 生成响应... }); } } }

这里有个坑——直接开线程池处理连接在高压下会炸。得改成IO完成端口模式,用SocketAsyncEventArgs搞异步回调。不过为了代码可读性先这么写着,后面再优化。

MVC API的实现更有意思。咱们得自己搞路由映射:

public class ApiController : ControllerBase { [Route("/api/users/{id}")] public HttpResponse GetUser(int id) { // 从数据库查数据... return Json(new { UserId = id }); } } // 路由匹配核心逻辑 var routeTemplate = "/api/users/{id}"; var requestPath = "/api/users/123"; var segments = routeTemplate.Split('/'); var pathSegments = requestPath.Split('/'); for (int i = 0; i < segments.Length; i++) { if (segments[i].StartsWith("{") && segments[i].EndsWith("}")) { var paramName = segments[i].Trim('{', '}'); parameters[paramName] = pathSegments[i]; } }

这段路由解析用到了模式匹配,比正则更高效。反射调用控制器方法时记得缓存MethodInfo,别每次都GetType()。

WebSocket服务要处理握手和帧解析:

// WebSocket握手响应 string key = "客户端发来的Sec-WebSocket-Key"; var responseKey = Convert.ToBase64String( SHA1.Create().ComputeHash( Encoding.ASCII.GetBytes(key + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"))); var handshakeResponse = "HTTP/1.1 101 Switching Protocols\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + $"Sec-WebSocket-Accept: {responseKey}\r\n\r\n"; // 处理数据帧 byte[] DecodeWebSocketFrame(byte[] buffer) { bool masked = (buffer[1] & 0x80) != 0; int payloadLength = buffer[1] & 0x7F; int maskOffset = 2; if (payloadLength == 126) { payloadLength = BitConverter.ToUInt16(buffer, 2); maskOffset += 2; } // 省略其他长度处理... }

注意掩码处理必须用XOR运算,这里最容易出内存泄漏,记得用ArrayPool来租用缓冲区。

大文件传输用分块传输+校验:

const int ChunkSize = 4 * 1024 * 1024; // 4MB/块 using var fileStream = new FileStream("bigfile.zip", FileMode.Open); var md5 = MD5.Create(); while (true) { byte[] buffer = ArrayPool<byte>.Shared.Rent(ChunkSize); int bytesRead = fileStream.Read(buffer, 0, buffer.Length); if (bytesRead == 0) break; // 发送数据块+哈希校验 var hash = md5.ComputeHash(buffer, 0, bytesRead); SendChunk(buffer, bytesRead, hash); ArrayPool<byte>.Shared.Return(buffer); }

这里用了内存池避免频繁GC,每传输完一个块立即释放。服务端接收时要做哈希校验和断点续传。

最后是服务自启动的黑魔法——用Windows服务包装器:

public class DaemonService : ServiceBase { private ServerHost _host; protected override void OnStart(string[] args) { _host = new ServerHost(); _host.AddService(new HttpServer()); _host.AddService(new FtpServer()); // 其他服务... _host.Start(); } // 安装时执行 public static void Install() { using var installer = new ServiceProcessInstaller(); installer.Account = ServiceAccount.LocalSystem; using var serviceInstaller = new ServiceInstaller(); serviceInstaller.ServiceName = "MyServer"; // 其他配置... } }

注意要在Release模式编译,不然服务可能起不来。整个项目最吃性能的是内存管理和线程调度,下一步打算上System.IO.Pipelines优化数据流处理。这堆轮子跑起来后,4核机器压测能到8万QPS,比跑在IIS上高两倍多,果然自己动手丰衣足食啊!

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

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

相关文章

pkill -15 monkey命令及信号15解释

pkill -15 monkey 这个命令的作用是&#xff1a; 命令功能 向所有名为 “monkey” 的进程发送信号 15&#xff08;SIGTERM&#xff09;&#xff0c;请求它们正常终止。 信号 15 的含义 15 是信号编号&#xff0c;对应 SIGTERM&#xff08;Termination Signal&#xff09;这是 &…

OSPF邻居建立失败完整排查指南

阿祥综合多年经验今天整理了下&#xff0c;OSPF邻居建立失败的核心排查点、补充要点及实操技巧&#xff0c;覆盖物理层、链路层、协议层及安全配置&#xff0c;按优先级排序&#xff0c;方便运维人员高效定位问题。 一、基础排查&#xff08;物理层链路层安全设备专属&#xff…

2025年12月 GESP CCF编程能力等级认证Python三级真题

答案和更多内容请查看网站&#xff1a;【试卷中心 -----> CCF GESP ----> Python ----> 三级】 网站链接 青少年软件编程历年真题模拟题实时更新 2025年12月 GESP CCF编程能力等级认证Python3级真题 1 单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xf…

大数据数据工程中的存储格式选择:Parquet vs ORC

大数据存储格式深度对比&#xff1a;Parquet与ORC的技术选型指南 元数据框架 标题&#xff1a;大数据存储格式深度对比&#xff1a;Parquet与ORC的技术选型指南关键词&#xff1a;大数据存储、列存格式、Parquet、ORC、性能优化、Schema演化、数据工程摘要&#xff1a;本文从第…

2025年12月 GESP CCF编程能力等级认证Python二级真题

答案和更多内容请查看网站&#xff1a;【试卷中心 -----> CCF GESP ----> Python ----> 二级】 网站链接 青少年软件编程历年真题模拟题实时更新 2025年12月 GESP CCF编程能力等级认证Python2级真题 一、 单选题&#xff08;每题 2 分&#xff0c;共 30 分&…

conda虚拟环境备份与安装

1、备旧环境配置到新环境 # 激活进入环境 conda activate my_env # 导出当前环境配置信息 conda env export > my_env_environment.yml # 导出依赖包 conda list --explicit > my_env_packages.txt # 创建新的虚拟环境 conda create --name my_new_env # 激活进入 conda …

全网最全9个一键生成论文工具,专科生毕业论文轻松搞定!

全网最全9个一键生成论文工具&#xff0c;专科生毕业论文轻松搞定&#xff01; 论文写作的救星&#xff1a;AI 工具如何改变专科生的学术之路 在当今这个信息爆炸的时代&#xff0c;论文写作已成为专科生毕业过程中不可回避的一环。面对繁重的写作任务、复杂的格式要求以及严格…

Qt学习记录

1.打印2.LABEL3信号槽&#xff08;Signal & Slot&#xff09;&#xff08;信号回调函数&#xff09;4.自定义信号槽&#xff1a;5.不用UI6.对象树7.添加资源&#xff1a;8.样式表QSS

java: 找不到符号,零基础入门到精通,收藏这篇就够了

文章目录 一、报错如图二、自己当前项目背景描述&#xff1a;三、排错方案举例 方案1&#xff1a;考虑Project Structure设置中Project中jdk版本是否对&#xff0c;确保所有子模块改为jdk1.8就好了方案2&#xff1a;考虑设置中java编码方式中各个子模块版本是否为1.8&#xff…

一文看懂Java内存模型(JMM)收藏这篇就够了

文章目录 Java内存模型介绍 总览图 Java内存模型图线程、主内存、工作内存关系图CPU缓存架构图Java内存模型与硬件内存架构的关系 什么是Java内存模型Java内存模型的意义Java内存模型规范 Java内存模型的主要结构 1、程序计数器&#xff08;Program Counter Register&#xff0…

【免费开源文本编辑器】轻量级文本编辑器——Notepad++ 下载安装教程

需求背景&#xff1a; 在数字时代的编程开发和文本处理工作中&#xff0c;一款功能强大且高效的文本编辑器至关重要。虽然Windows系统自带的记事本能满足基本需求&#xff0c;但在专业场景下显得力不从心。今天为您推荐 Notepad —— Windows平台最受欢迎的免费开源文本编辑器…

LeetCode 468 验证 IP 地址

文章目录摘要描述IPv4 的规则可以总结成一句话IPv6 的规则则是题解答案题解代码分析IPv4 校验逻辑拆解IPv6 校验逻辑拆解示例测试及结果示例 1示例 2示例 3时间复杂度空间复杂度总结摘要 《验证 IP 地址》是一道非常工程化的题。 它不像很多算法题那样考复杂技巧&#xff0c;…

状态管理:Flutter 为什么走上了和前端一样的“百家争鸣”?

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

DeepSeek对于DuckDB on LoongArch一文的总结

原文地址 https://duckdb.org/2026/01/06/duckdb-on-loongarch-morefine用中文总结附件这是一篇由 Hannes Mhleisen 于2026年1月6日撰写的技术博客&#xff0c;主要内容为在基于龙芯架构&#xff08;LoongArch&#xff09;的龙芯CPU设备&#xff08;MOREFINE M700S&#xff09;…

学长亲荐2026自考AI论文工具TOP10:选对工具轻松过关

学长亲荐2026自考AI论文工具TOP10&#xff1a;选对工具轻松过关 2026年自考AI论文工具测评&#xff1a;选对工具&#xff0c;事半功倍 随着人工智能技术的不断进步&#xff0c;越来越多的自考生开始借助AI写作工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的工具&…

Springboot品牌购物官网rmu1i本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表项目功能&#xff1a;开题报告内容进度安排&#xff1a;1、XXXX年X月X日-XXXX年X月XX日&#xff1a;完成前期资料的搜集与整理&#xff0c;撰写开题报告以及开题PPT。2、XXXX年X月X日-XXXX年X月XX日&#xff1a;设计完成系统的总体框架。3、XXXX年X月X日-XXXX年…

一文看懂 NVIDIA 平台全栈:从 CUDA 到 Jetson / DRIVE / Isaac 的当下走向

&#x1f4fa; B站视频讲解&#xff08;Bilibili&#xff09;&#xff1a;https://www.bilibili.com/video/BV1k1C9BYEAB/ &#x1f4d8; 《Yocto项目实战教程》京东购买链接&#xff1a;Yocto项目实战教程 一文看懂 NVIDIA 平台全栈&#xff1a;从 CUDA 到 Jetson / DRIVE / …

群体智能 AI Agent:多个 LLM 协作的分布式系统

群体智能 AI Agent:多个 LLM 协作的分布式系统 关键词:群体智能、AI Agent、大型语言模型(LLM)、分布式系统、多 LLM 协作 摘要:本文围绕群体智能 AI Agent 这一多个 LLM 协作的分布式系统展开深入探讨。首先介绍了该系统提出的背景、目的、适用读者及文档结构等信息。接着…

nums.sort()和nums.sort((a, b) => a - b)

这两者有重要区别&#xff1a; nums.sort() 默认按字符串排序&#xff08;字典序&#xff09;&#xff0c;即使数组里是数字也会被转换为字符串再比较&#xff1a; let nums [100, 4, 200, 1, 3, 2]; nums.sort(); // [1, 100, 2, 200, 3, 4] console.log(nums); // 错误的顺序…

吐血推荐10个AI论文网站,自考本科论文格式规范必备!

吐血推荐10个AI论文网站&#xff0c;自考本科论文格式规范必备&#xff01; 自考论文写作的“神器”正在改变你的学习方式 在自考本科论文写作过程中&#xff0c;许多学生都面临一个共同难题&#xff1a;如何高效完成一篇符合格式规范、内容严谨的论文。尤其是在当前AIGC技术广…