HTTP Server : 一个差生的逆袭

http server&client;(select模型) 采用select模型的http server和client,代码里有readme,包括支持功能和编译方法。linux下编译.整体功能已经商用。压力测试通过 立即下载

我刚毕业那会儿,国家还是包分配工作的,我的死党张大胖被分配到了一个叫数据库的大城市,天天都可以坐在高端大气上档次的机房里,在那里专门执行SQL查询优化,工作稳定又舒适。

隔壁宿舍的小白被送到了编译器镇,在那里专门把C源文件编译成EXE程序,虽然累,但是技术含量非常高,工资高,假期多。

我成绩不太好,典型的差生,四级补考了两次才过,被发配到了一个不知道什么名字的村庄,据说要处理什么HTTP请求,这个村庄其实就是一个破旧的电脑,令我欣慰的是可以上网,时不时能和死党们通个信什么的。

不过辅导员说了,我们都有光明的前途。

HTTP Server 1.0

HTTP是个新鲜的事物,能够激起我一点点工作的兴趣,不至于沉沦下去。

一上班,操作系统老大扔给我一大堆文档:“这是HTTP协议,两天看完!”

我这样的英文水平, 这几十页的英文HTTP协议我不吃不喝不睡两天也看不完,死猪不怕开水烫,慢慢磨吧。

两个星期以后,我终于大概明白了这HTTP是怎么回事:无非是有些电脑上的浏览器向我这个破电脑发送一个预先定义好的文本(HTTP Request), 然后我这边处理一下(通常是从硬盘上取一个后缀名是html的文件),然后再把这个文件通过文本方式发回去(HTTP Response),就这么简单。

唯一麻烦的实现,我得请操作系统给我建立HTTP层下面的TCP连接通道, 因为所有的文本数据都得通过这些TCP通道接收和发送,这个通道是用socket建立的。

弄明白了原理,我很快就搞出了第一版程序,这个程序长这个样子:

(注:详情参见文章《张大胖的socket》)

看看,这些socket, bind, listen , accept... 都是操作系统老大提供的接口,我能做的也就是把他们组装起来:先在80端口监听,然后进入无限循环,如果有连接请求来了,就接受(accept),创建新的socket,  最后才可以通过这个socket来接收,发送http数据。

老大给我的程序起了个名称,Http Server, 版本1.0 。

这个名字听起来挺高端的,我喜欢。

我兴冲冲地拿来实验, 程序启动了,在80端口“蹲守”,过了一会儿就有连接请求了,赶紧Accept,建立新的socket,成功 !接下来就需要从socket 中读取HTTP Request了。

可是这个receive 调用好慢,我足足等了100毫秒还没有响应 !我被阻塞(block)住了!

操作系统老大说:“别急啊,我也在等着从网卡那里读数据,读完以后就会复制给你。”

我乐得清闲,可以休息一下。

可是操作系统老大说:“别介啊,后边还有很多浏览器要发起连接,你不能在这儿歇着啊。”

我说不歇着怎么办?receive调用在你这里阻塞着,我除了加入阻塞队列,让出CPU让别人用还能干什么?

老大说:“唉,大学里没听说过多进程吗?你现在很明显是单进程,一旦阻塞就完蛋了,想办法用下多进程,每个进程处理一个请求!”

老大教训的是,我忘了多进程并发编程了。

HTTP 2.0 :多进程

多进程的思路非常简单,当accept连接以后,对于这个新的socket,不在主进程里处理,而是新创建子进程来接管。这样主进程就不会阻塞在receive 上,可以继续接受新的连接了。

我改写了代码,把HTTP server 升级为V2.0,这次运行顺畅了很多,能并发地处理很多连接了。

这个时候Web 刚刚兴起,我这个HTTP Server 访问的人还不多,每分钟也就那么几十个连接发过来,我轻松应对。

由于是新鲜事物,我还有资本给搞数据库的小明和做编译的小白吹吹牛,告诉他们我可是网络高手。

没过几年,Web迅速发展,我所在的破旧机器也不行了,换成了一个性能强悍的服务器,也搬到了四季如春的机房里。

现在每秒都有上百个连接请求了,有些连接持续的时间还相当得长,所以我经常得创建成百上千的进程来处理他们,每个进程都得耗费大量的系统资源,很明显操作系统老大已经不堪重负了。

他说:“咱们不能这么干了,这么多进程,光是做进程切换就把我累死了。”

“要不对每个Socket连接我不用进程了,使用线程?”

“可能好一点,但我还是得切换线程啊,你想想办法限制一下数量吧。”

我怎么限制?我只能说同一时刻,我只能支持x个连接,其他的连接只能排队等待了。

这肯定不是一个好的办法。

HTTP Server 3.0 : Select模型

老大说:“我们仔细合计合计,对我来说,一个Socket连接就是一个所谓的文件描述符(File Descriptor ,简称 fd ,是个整数),这个fd 背后是一个简单的数据结构,但是我们用了一个非常重量级的东西‘进程’来表示对它的读写操作,有点浪费啊。”

我说:“要不咱们还切换回单进程模型?但是又会回到老路上去,一个receive 的阻塞就什么事都干不了了。”

“单进程也不是不可以,但是我们要改变一下工作方式。”

“改成什么?” 我猜不透老大在卖什么关子。

“你想想你阻塞的本质原因,还不是因为人家浏览器还没有把数据发过来,我自然也没法给你,而你又迫不及待地想去读,我只好把你阻塞。在单进程情况下,一阻塞,别的事儿都干不了。“

“对,就是这样。”

“所以你接受了客户端连接以后,不能那么着急地去读,咱们这么办,你的每个socket fd 都有编号,你每次把一批socket的编号告诉我,就可以阻塞休息了。”

[注:实际上,HTTP Server和操作系统之间传递的并不是socket fd的编号,而是一个叫做fd_set的数据结构]

我问道:“这不和以前一样吗?原来是调用receive 时阻塞,现在还是阻塞。”

“听我说完,我会在后台检查这些编号的socket,如果发现这些socket 可以读写,我会把对应的socket 做个标记,把你唤醒去处理这些socket 的数据,你处理完了,再把你的那些socket fd 告诉我,再次进入阻塞,如此循环往复。”

我有点明白了:“这是我们俩的一种通信方式,我告诉你我要等待什么东西,然后阻塞, 如果事件发生了,你就把我唤醒,让我做事情。”

“对,关键点是你等我的通知,我把你从阻塞状态唤醒后,你一定要去遍历一遍所有的socket fd(实际上就是那个fd_set的数据结构),看看谁有标记,有标记的做相应处理。我把这种方式叫做 select模型。”

我用select的方式改写了HTTP server,抛弃了一个socket请求对于一个进程的模式, 现在我用一个进程就可以处理所有的socket了。

HTTP Server4.0 : epoll

这种称为select的方式运行了一段时间,效果还不错,我只管把socket fd 告诉老大,然后等着他通知我就行了。

有一次我无意中问老大:“我每次最多可以告诉你多少个socket fd?”

“1024个。”

“那就是说我一个进程最多只能监控1024个socket了?”

“是的,你可以考虑多用几个进程啊。”

这倒是一个办法,不过“select”的方式用的多了,我就发现了弊端,最大的问题就是我需要把socket的编号(实际上是fd_set数据结构)不断地复制给操作系统老大,这挺耗资源的,还有就是我从阻塞中恢复以后,需要遍历这1000多个socket fd,看看有没有标志位需要处理。

实际的情况是,很多socket 并不活跃, 在一段时间内浏览器并没有数据发过来,这1000多个socket 可能只有那么几十个需要真正的处理,但是我不得不查看所有的socket fd,这挺烦人的。

难道老大不能把那些发生了变化的socket 告诉我吗?

我把这个想法给老大说了下,他说:“嗯,现在访问量越来越大,select 方式已经不满足要求,我们需要与时俱进了,我想了一个新的方式,叫做epoll。”

“看到没有,使用epoll和select 其实类似,” 老大接着说 :“不同的地方是,我只会告诉你那些可以读写的socket , 你呢只需要处理这些准备就绪的socket 就可以了。”

“看来老大想得很周全,这种方式对我来说就简单得多了。”

我用epoll 把HTTP Server 再次升级,由于不需要遍历全部集合,只需要处理那些有变化的、活跃的socket 文件描述符,系统的处理能力有了飞跃的提升。

我的HTTP Server 受到了广泛的欢迎,全世界有无数人在使用,最后死党数据库小明也知道了,他问我:“大家都说你能轻松地支持好几万的并发连接,真是这样吗?”

我谦虚地说:“过奖,其实还得做系统的优化啦。”

他说:“厉害啊,你小子走了狗屎运了啊。”

我回答:“毕业那会儿辅导员不是说过吗,每个人都有光明的前途。”

后记:最近有几个人问我select和epoll的事情,其实我几年前写过一篇文章的,只是有些小错误,今天整理一下再发一次。

《用故事讲解技术,尽在码农翻身》 

模电学习笔记(十二)——跨阻放大器 模电学习笔记(十二) 跨阻放大器 跨组运算放大器是将电流信号转换成为电压信号,电流到电压增益基于反馈电阻。 设计目标: 输入 输出 带宽 电源 0A 100uA 0V 7V 20kHz 15V -15V 1.计算R1的值(增益电阻器) 2.计算C1的值满足电路带宽 ... 阅读详情

相关推荐

别再只会用555了!手把手教你用运放和RC电路搭一个50Hz正弦波信号源(附Multisim仿真文件)

本文详细介绍了如何使用运放LM358和RC电路搭建一个精准的50Hz正弦波信号源,涵盖文氏电桥核心原理、单电源供电解决方案、Multisim仿真及实物调试技巧。通过实战指南和优化建议,帮助电子爱好者快速掌握低频信号生成技术,适用于各种测试和校准场景。

weixin_34116482的博客 365

HTTP服务-select

【代码】HTTP服务-select。

weixin_44497507的博客 250

Windows 11 IoT企业版LTSC 24H2/25H2中文版安装指南(含OEM激活教程)

本文详细介绍了Windows 11 IoT企业版LTSC 24H2/25H2中文版的安装与OEM激活全流程。从系统镜像准备、硬件兼容性检查到自动化安装配置,再到OEM激活方案(包括SLIC注入和数字许可证激活),为工业自动化、数字标牌等物联网设备提供稳定可靠的系统部署指南。

weixin_29198045的博客 8864

【网络】高级IO——select版本TCP服务器

我们今天要讲的select,select的原理就像下面的赵六一样。赵六去钓鱼,他是个小土豪,赵六手里拿了一堆鱼竿,目测有几百根鱼竿,赵六到达河边,首先就把几百根鱼竿每隔几米插上去,总共插了好几百米的鱼竿,然后赵六就依次遍历这些鱼竿,哪个鱼竿上的鱼漂动了,赵六就把这根鱼竿上的鱼钓上来,然后接下来赵六就又继续重复之前遍历鱼竿的动作进行钓鱼了。

2301_80224556的博客 1661

自适应滤波算法综述

自适应滤波算法综述

xdzhujy的博客 5万+

FDTD Script命令学习-farfield3d/farfieldux/farfielduy

介绍了farfield3d/farfieldux/farfielduy命令功能,及不同应用语法和参数介绍,以及对官网示例进行介绍。

jxxl_1314的博客 3098

http server 值select 学习

select  函数1、用途    在编程的过程中,经常会遇到许多阻塞的函数,好像read和网络编程时使用的recv, recvfrom函数都是阻塞的函数,当函数不能成功执行的时候,程序就会一直阻塞在这里,无法执行下面的代码。这是就需要用到非阻塞的编程方式,使用select函数就可以实现非阻塞编程。       select函数是一个轮循函数,循环询问文件节点,可设置超时时间,超时时间到了就跳过代...

Lustrum的博客 535

ubuntu安装XXX包时出现(= 20.0.8-0ubuntu1~18.04.1) but it is not going to be installed

安装mujoco_py时,最后一步尝试 import mujoco_py 时出现报错 esashim.c:1:10: fatal error: GL/osmesa.h: No such file or directory 1 | #include <GL/osmesa.h> | ^~~~~~~~~~~~~ compilation terminated. 在https://github.com/openai/mujoco-py#ubuntu-ins

dealexce的博客 1794

我的第一篇博客

我的第一篇博客 1,。自我介绍: 我叫沈家鹏,今年大一,就读广东省华南农业大学某食品专业,即使我读的不是计算机相关专业,但由于我热爱编程,所以我一直努力的在自学编程。 2.我的编程目标: 能够精通C语言和JAVA,能够达到运用自如的地步,可以让我在未来找到一份满意的工作。 3我的学习编程计划: 在网上找资源自学编程,然后多读多看多学,再多练,然后再进行总结自己的不足。 4.我打算每周在学习编程花费多少时间: 应该做到每天自学编程,根据每天的安排,学习的时间长短不一,但要保证每天都要学习编程,保证每天学习编程

sjp11的博客 1157

把 SAP OData 查询模式讲透:从 $select 到 $expand 的设计、实现与性能边界

摘要:本文深入探讨SAP生态中OData查询模式的核心设计与实现要点。文章指出,OData不仅是接口协议,更是HTTP、REST与数据模型的统一语言,其性能关键取决于查询选项($select、$filter等)的设计与实现质量。重点分析了$select的投影优化、$orderby的排序语义、$filter的数据库下推策略,以及$count的高效计数方法。通过具体示例和最佳实践,强调应将查询逻辑尽量下推至数据库层,避免在ABAP应用层处理大数据集,从而提升服务性能、降低资源消耗,实现Clean Core架构理

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 649

你知道几种数字地与模拟地连接方式及优缺点?

频率选择性:磁珠的阻抗特性随频率变化,只对某个频点的噪声有显著抑制作用,对于频率不确定或无法预知的情况,可能不是最佳选择。在实际应用中,选择合适的连接方式需要根据具体的电路频率、信号类型、设计要求等因素综合考虑,以达到最佳的电磁兼容效果.高频信号干扰:在高频电路中,单点接地可能导致信号回流路径过长,增加地线电感,从而引入高频噪声。限制噪声电流:0欧姆电阻相当于一个非常窄的电流通路,能够有效地限制环路电流,使噪声得到抑制。抑制高频信号:电感对高频信号有较大的阻碍作用,可以有效抑制高频噪声。

linkking27的博客 801

Http Server : 一个差生的逆袭

我刚毕业那会儿,国家还是包分配工作的, 我的死党小明被分配到了一个叫数据库的大城市,天天都可以坐在高端大气上档次的机房里, 在那里专门执行SQL查询优化 , 工作稳定又舒适; 隔壁宿舍的小白被送到了编译器镇,在那里专门把C源文件编译成EXE程序, 虽然累,但是技术含量非常高, 工资高,假期多。 我成绩不太好,典型的差生,四级补考了两次才过, 被发配到了一个不知道

GarfieldEr007的专栏 1298

Android Treble 简介

上面两段话来自官网上,Android 8.0 重新设计了 Android 操作系统框架(在一个名为“Treble”的项目中),以便让制造商能够以更低的成本更轻松、更快速地将设备更新到新版 Android 系统。本文主要整理一下Android Treble框架。

私房菜 9275

HTTP Server : 一个差生的逆袭(转码农翻身)

我刚毕业那会儿,国家还是包分配工作的,我的死党张大胖被分配到了一个叫数据库的大城市,天天都可以坐在高端大气上档次的机房里,在那里专门执行SQL查询优化,工作稳定又舒适。隔壁宿舍的小白被送到了编译器镇,在那里专门把C源文件编译成EXE程序,虽然累,但是技术含量非常高,工资高,假期多。我成绩不太好,典型的差生,四级补考了两次才过,被发配到了一个不知道什么名字的村庄,据说要处理什么HTTP请求,这个村庄其实就是一个破旧的电脑,令我欣慰的是可以上网,时不时能和死党们通个信什么的。不过辅导员说了,我们都有...

291

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

使用http-server启动本地服务

经常用到的一个指令:开启http服务 http-server -c-1 简述:在本地启动一个简单易用的服务器 1.安装node.js 2.安装http-server 进行全局安装,-g表示安装到全局,之后所有文件夹路径下输入http-server都可以使用 npm install http-server -g 3.开启服务 进入到需要启动服务的文件夹,输入http-server命令就可以启动了 -c-1是禁用缓存的意思,其他可选配置如下: -p 要使用的端...

hsany330的专栏 2032

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

简单HTTP服务器(select模型)

server.c #include #include #include #include #include #include #include #include #include #include #define SERVER_NAME "IAMCAP-SERVER" #define PROTOCOL "HTTP/1.1" #define REQUESTLEN 409

异度空间 1219

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

HttpServer:一款Windows平台下基于IOCP模型的高并发轻量级web服务器

HttpServer的特点 1、完全采用IOCP模型,实现真正的异步IO,高并发、高可靠; 2、支持4G以上文件下载; 3、支持断点续传; 4、轻量级,体积小,服务器文件仅200多K,无任何依赖库; 5、支持CGI网关,通过CGI.xml可动态配置各种网关接口,实现动态交互; 6、内置上传文件接口; 点击此处下载 ​ 一、命令行参数介绍 启动服务器: HttpServer.exe -W d:\web -H index.html -P 80 -M 10000 -W : web网站的发布路径,如:d:\web,

lgsoftlee的博客 4653

HTTP Server:从头开始构建简单HTTP服务器需要了解的所有内容

文章翻译至: HTTP Server: Everything you need to know to Build a simple HTTP server from scratch HTTP无处不在! 我们访问的每个网站都在HTTP服务器上运行。 您可能会说还有HTTPS服务器。 从技术上讲,HTTPS与HTTP相同,只是HTTPS具有更高的安全性。 许多程序员可能会对HTTP服务器的工作原理以及...

aboutmn的博客 1万+

apache-http-server下载与启动

apache-http-server下载与启动下载1. http://httpd.apache.org/下面可以显示需要下载的版本,这里以第一个为例子点击图标就可以下载了,具体要下载32位还是64位的根据系统下载启动解压后打开docs界面,如果想将服务器的启动添加到windows服务中如下:主要作用是不用docs命令就可以启动项目请输入httpd -k install如果启动还需要一个问题,就是修...

一叶知春秋 4154

HTTP File Server一款http服务器软件

很多朋友都希望能把自己电脑上不同地方的文件、文件夹等以网页的形式提供给别人下载。今天介绍的HTTP File Server(HFS)将为带您步入轻松文件共享的新生活! HTTP File Server 是一款专为个人用户设计的HTTP文件共享绿色软件。这个软件提供了完善的网络传输功能:支持断点续传,支持多线程下载,最重要的就是使用了“Virtual File System(虚拟文件系统)”,这使...

nicholas_duan的博客 9610

http-server 超轻量级web服务器

有的时候做前端,想要运行一些代码,但是又没有必要使用tomcat或者Apache http server,这个时候一个轻量级的简单的http server就可以搞定了。 Http-server是基于nodejs的http服务器,它最大好处就是:   可以使任意一个目录成为服务器的目录,完全抛开后台的沉重工程,直接运行想要的js代码。   1 安装nodejs   为了运行http-...

weixin_33785972的博客 992

如何为HttpServer服务器配置PHP FastCGI,从而让HttpServer具备动态交互能力

一、 软件准备 1、下载HttpServer :HttpServer.zip HttpServer是一款windows平台下基于IOCP模型的轻量级、高并发、高性能web服务器(参见文章)。 2、下载Windows版本PHP 以下是绿色版本无需安装,解压即可,建议用迅雷下载速度更快。 版本1:php-5.2.16-nts-Win32-VC6-x86.zip 版本2:php-7.0.15-nts-Win32-VC14-x86.zip 二、 配置PHP FastCGI 1、 解压PHP到指定目录,如 D:/

lgsoftlee的博客 446

一次对server服务大量积压异常TCP ESTABLISHED链接的排查笔记

背景 我们都知道,基于Kubernetes的微服务,大行其道,传统部署模式一直都在跟着变化,但其实,在原有业务向服务化方向过度过程中,有些场景可能会变得复杂。 比如说:将Kubernetes的模式应用到开发环节上,这个环节需要频繁的变更代码,微服务的方式,可能就需要不断的: 改代码->构建镜像->镜像推送->部署->拉去镜像->生成容器 尤其是PHP的业务,不需要构建二进制,仅需要发布代码,因此,如果按照上面的部署方式,就需要频繁改代码,走构建镜像这个流程,最后再做

ptrunner的专栏 1641

HttpServer性能比较

在自己的本子上随便测了下几款HttpServer,环境信息就不贴出来了,主要是比对下差距。 测试内容是输出 text/plain 的 hello, world。 先说结论:Netty > Jooby > JDK HttpServer > Jersey-Netty > Jersey-HttpServer > RESTeasy-netty4 > SpringBo...

weixin_30401605的博客 859
上一篇: 和6岁孩子的函数式编程对话
下一篇: 为什么大家说Java落伍,Python太慢,JavaScript太烂,OOP已死
码农翻身
码农翻身 《码农翻身》作者 《码农翻身》作者
博客等级 码龄8年 3万+粉丝 1084原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值