项目总结-自主HTTP实现

终于是写完了,花费了2周时间,一点一点看,还没有扩展,但是基本功能是已经实现了。利用的是Tcp为网络链接,在其上面又写了http的壳。没有使用epoll,多路转接难度比较高,以后有机会再写,使用了多线程来对每一个链接请求做工作,每次处理一个工作后,响应结束后,服务器主动关闭对端链接,做到短链接,防止服务器链接过载宕机,主要是我的云服务器是学习用的,硬件就摆在哪里,过多的链接会导致我服务器崩溃,这是没有办法的呀。

项目我采用技术有:

  • 线程池
  • 定向对象池
  • TCP/IP
  • HTTP协议解析
  • 生产消费者模型(线程池基于我们的方便)
  • CGI模式
  • C语言对数据库访问
  • 其他杂七杂八的知识

设计的类有:

  • object类:定向对象内存池,创建和析构对象的用户内存池
  • Sock类:对listen初始化和获取外部链接的一个插件类,为TcpServer做配件。
  • TcpServer类:对于链接的承上启下的,使用哈希桶在用户层管理每个链接的链接状态,为http提供接口,使用Sock类的接口。
  • Connection类:对从Accept取得的外部链接做进一步封装。
  • HttpServer类:使用TcpServer类做的上层管理。也其实是中转站。

  • Log类:写日志的类。

  • HttpRequest类:管理链接发来的数据,解析协议后存放类。

  • HttpResponse类:管理给对端发送的数据,保存协议生成的类。

  • EndPoint类:处理协议的地方,并且并且构建响应,发送http响应报文

  • CallBack类:这是我们处理任务的地方,当任务结束析构该类,也会析构该链接。

  • Task类:构建对象,传递到任务队列中(不论阻塞还是环形)

  • GuardLock类:哨兵锁,我们定义了一个全局的锁,为了单例所使用

  • ThreadPool类:线程池一次性启动一堆线程,循环的方式等待任务队列有东西,有就拿,没就等

执行流程大致为:

  • 前期:我们的服务器启动,单例线程池创建,多条线程开始等待,单例TcpServer生成,Connection池生成,开始listen套接字绑定,开启监听模式,accept开始等待链接。
  • 浏览器->服务器:浏览器构建http报文,并且发送给服务器发起链接请求,在三次握手后,服务器从Sock拿到链接到HttpServer中,使用链接创建Task任务对象,然后将任务放入连接池中的任务队列后中,剩下对接其链接的事情就交给子线程了。然后放入后就继续等待链接了。
  • 线程->协议解析:在等待的线程从任务队列中得到了一个任务,使用任务的回调方法,其实就是Callback的’()‘重载每个任务其实都一样都是调用运算符重载,只是传入的链接不同。CallBack的运算符重载函数中,生成EndPoint对象传入conn链接,EndPoint对象启动对链接的读取,协议解析,构建响应,发送响应。
  • 构建响应:在构建响应的过程中,我们甄别是否为CGI模式请求,根据GET url是否有参数(看看有没有?字符存在),如果是POST模式,我们直接认为是CGI模式的请求。
  1. 非CGI模式:打开其url访问的路径文件,不用读取其路径文件(在我们的磁盘上),然后其实就发送响应了,然后继续响应报文其他部分。
  2. CGI模式:创建2个管道做数据的交互,创建子进程,在程序替换前将子进程的0、1文件描述符dup为管道的读写端文件描述符,如果是GET方法的CGI模式,我们采用环境变量传参传递快,缺点参数不能太长,如果是POST则只能读取数据,然后子进程程序替换,当然在替换前我们还得传个环境变量,其是来帮助我们确定请求方法的,为了POST方法读取参数使用。在CGI程序中处理完毕后构建响应数据通过dup后的文件描述符1,写回父进程,然后关闭,父进程是使用响应报文的body来接收子进程发送给其的处理后的数据。
  3. 其他构建:构建协议状态行这是同一的构建,然后根据状态码,构建协议报头head。
  • 响应发送:响应构建完毕,将响应报文以状态行,报头,空行,实际数据依次发送,在发送最后的数据body的时候,根据是否为CGI模式区分发送模式,是CGI模式,就发送响应中保存的body数据,不是CGI模式,就通过sendfile函数将_fd磁盘中数据直接发送给sock链接中,以内核数据拷贝到内核数据的方式,减少拷贝,body数据不在经过用户层。
  • 发送完毕:发送完毕,EndPoint对象释放,当然也可以为其创建对象池。线程结束任务继续尝试从任务池获取下一个任务。
  • 服务器->浏览器:浏览器得到响应,解析协议,这不是我该处理的活。

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

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

相关文章

一张图片组合一组动作就可以生成毫无违和感的视频!

你敢信,1张人物图片 1张动作动画,就可以生成一段视频。网友直呼:“主播/视频UP主可能快要下岗了!” (模型视频来源于网络) 本周,字节跳动联合新加坡国立大学发布了一款开源项目 MagicAnimate&…

Linux Ubuntu 手动搭建webDav

1、安装 因为需要跟 zotero 进行交互,因此需要在服务器搭建一个webDav 以下是搭建步骤: sudo apt-get update sudo apt-get install apache2 Ubuntu 安装apache2来实现 不同于Centos 安装好了之后,运行 a2enmod dav_fs a2enmod dav 激…

【视频笔记】古人智慧与修行

古人的智慧 相由心生、老子悟道、佛祖成佛 多一些思考,多一些精神修炼。 除非我们今天能够产生与人类科技发展相并行的精神变革,否则永远可能也无法跳脱出历史的轮回。 视频来源 曾仕强教授周易的智慧 太极两仪四象八卦 一生二,二生三&…

大数据机器学习深度解读决策树算法:技术全解与案例实战

大数据机器学习深度解读决策树算法:技术全解与案例实战 本文深入探讨了机器学习中的决策树算法,从基础概念到高级研究进展,再到实战案例应用,全面解析了决策树的理论及其在现实世界问题中的实际效能。通过技术细节和案例实践&…

现代雷达车载应用——第2章 汽车雷达系统原理 2.5节 检测基础

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 2.5 检测基础 对于要测试目标是否存在的雷达测量,可以假定下列两个假设之一为真: •H0:—测量结果仅为噪声。 •H1:—测量是噪…

eNSP小实验(vlan和单臂路由)

一.vlan的划分 实验目的&#xff1a; ①pc1 只可以和pc2通信&#xff0c;不可以和pc3 pc4通信 ②pc1和pc2只能到Server1&#xff0c;pc3和pc4到Server2 1.拓扑图 2.配置 PC1-4 同理配置 SW1 <Huawei> <Huawei>u t m //关闭注释 Info: …

Nginx的location匹配和rewrite重写

一、location匹配 常用的正则表达式 ^ &#xff1a;匹配输入字符串的起始位置 $ &#xff1a;匹配输入字符串的结束位置 * &#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”&#xff1a;匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll…

1.5万字 + 25张图盘点RocketMQ 11种消息类型,你知道几种?

本文是基于RocketMQ 4.9版本讲解 前置知识 为了帮助大家更好地理解这些消息底层的实现原理&#xff0c;这里我就通过三个问题来讲一讲RocketMQ最最基本的原理 1、生产者如何发送消息 在RocketMQ中有两个重要的角色 NameServer&#xff1a;就相当于一个注册中心 Broker&#xf…

批量生成标题文章:AI文章创作助力高效办公,提升办公效率

随着人工智能技术的不断发展&#xff0c;AI文章创作已经成为了高效办公的新趋势。这种技术可以快速生成高质量的文章&#xff0c;从而大大提高办公效率。相比传统的手写文章&#xff0c;AI文章创作具有更高的效率和准确性。在撰写文章时&#xff0c;往往要花费大量的时间和精力…

SpringBoot之视图渲染技术

前言 在Spring Boot中&#xff0c;视图渲染技术用于将动态数据渲染到用户界面&#xff0c;生成最终的HTML、XML、JSON等文档&#xff0c;以便将其返回给客户端浏览器 一.关于Freemarker 1.介绍 Freemarker是一个Java模板引擎&#xff0c;用于生成基于模板的动态内容。它是一…

有没有手机电脑同步的工作时间管理软件?

越来越多的职场人士感到每天的工作任务是比较多的&#xff0c;而工作时间又是有限的&#xff0c;所以经常时间不够用。因此&#xff0c;对于上班族来说&#xff0c;高效的时间管理是提高工作效率、按时完成任务的关键。为了满足这一需求&#xff0c;很多网友都在寻找一款既能在…

Leetcode 139.单词拆分

OJ链接 &#xff1a;139.单词拆分 代码&#xff1a; class Solution {public boolean wordBreak(String s, List<String> wordDict) {Set<String> set new HashSet<String>(wordDict);int n s.length();boolean[] dp new boolean[n1];dp[0] true;//初始…

Ant中a-select 下拉选择内容过多,滚动条,滚动定位偏移

1.绑定值为null,默认选项&#xff0c;会出现滚动问题&#xff0c;定位偏移&#xff0c;ant官网解释如下 getPopupContainer菜单渲染父节点。默认渲染到 body 上&#xff0c;如果你遇到菜单滚动定位问题&#xff0c;试试修改为滚动的区域&#xff0c;并相对其定位。Function(tr…

SpringBoot整合Kafka (一)

&#x1f4d1;前言 本文主要讲了SpringBoot整合Kafka文章⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f304;每日一句&#xff1a;努力一点&#xff0c;优秀一点 目录 文章目录 &…

【Python】计算最少排班人数(2)

接前一文章 部分关键代码及方法&#xff1a; 程序界面代码&#xff1a; winTk() win.config(bg#F2F2D7) win.geometry(550x440) win.title(最优排班计算器)frameFrame(win,width500,height60,bg#F2F2D7) frame.grid(row0,column0,columnspan5) l1Label(frame,text选择文件&a…

JetBrains2023年度报告,编程领域的风向标

前言 JetBrains是一家位于捷克的软件开发公司&#xff0c;有很多知名的开发IDE都是他们家的&#xff0c;比如IntelliJ IDEA、CLion、PyCharm、WebStorm等等&#xff0c;还有Kotlin编程语言也是JetBrains开发的&#xff0c;后来成为Android官方开发语言。 自2017年JetBrains发…

JVM之jmap java内存映射工具

jmap java内存映射工具 1、jmap jdk安装后会自带一些小工具&#xff0c;jmap命令(Memory Map for Java)是其中之一。主要用于打印指定Java进程(或核 心文件、远程调试服务器)的共享对象内存映射或堆内存细节。 jmap命令可以获得运行中的jvm的堆的快照&#xff0c;从而可以离…

使用 Timm 库替换 YOLOv8 主干网络 | 1000+ 主干融合YOLOv8

文章目录 前言版本差异说明替换方法parse_moedl( ) 方法_predict_once( ) 方法修改 yaml ,加载主干论文引用timm 是一个包含最先进计算机视觉模型、层、工具、优化器、调度器、数据加载器、数据增强和训练/评估脚本的库。 该库内置了 700 多个预训练模型,并且设计灵活易用。…

经典策略筛选-20231213

策略1&#xff1a; 龙头战法只做最强&#xff1a;国企改革 ----四川金顶 1、十日交易内出现 涨停或 &#xff08;涨幅大于7个点且量比大于3&#xff09; 2、JDK MACD RSI OBV LWR MTM 六指标共振 3、均线多头 4、 筹码峰 &#xff08;锁仓&#xff09; 5、现价> 五日均…

OkHttp: 拦截器和事件监听器

文章目录 1. 拦截器1. 拦截器链2. 实际案例1. 注册为应用拦截器2. 注册为网络拦截器 3. 如何选择用哪种拦截器1. 应用拦截器2. 网络层拦截器3. 重写请求4. 重写响应 4. 可用性 2. 事件监听器1. 请求的生命周期2. EventListener使用案例3. EventListener.Factory4. 调用失败的请…