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

项目总结-自主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实现

终于是写完了,花费了2周时间,一点一点看,还没有扩展,但是基本功能是已经实现了。利用的是Tcp为网络链接,在其上面又写了http的壳。没有使用epoll,多路转接难度比较高,以后有机会再写&#xff0c…...

Java语言+二维数组+非递归实现五子棋游戏

以前做过一个C语言版五子棋:C语言+二维数组+非递归实现五子棋游戏 现在做一个Java语言版五子棋,规则如下: 1、白子为O; 2、黑子为; 3、白子先手;…...

WordCloud—— 词云

【说明】文章内容来自《机器学习入门——基于sklearn》,用于学习记录。若有争议联系删除。 wordcloud 是python的第三方库,称为词云,也成文字云,可以根据文本中的词频以直观和艺术化的形式展示文本中词语的重要性。 依赖于pillow …...

linux网络----UDP编程

一、函数接口: 1.socket:创建一个用来网络通信的终端节点; 参数: type:套接字类型 SOCK_STREAM 流式套接字 TCP SOCK_DGRAM 数据报套接字 UDP SOCK_RAM 原始套接字 domain: 协议族 AF_INET protocal: 默认为0 2.s…...

[AI工具推荐]AiRestful智能API代码生成

智能API代码示例生成工具AiRestful 一、产品介绍二、如何使用1、第一步(必须):2、第二步(可选):3、第三步(智能生成): 三、如何集成到您的网站(应用)1、开始接入2、接入案例 四、注意点 一、产品介绍 AiRestful是一款基于智能AI的,帮助小白快速生成任意编程语言的API接口调用示…...

Elasticsearch 8.10.0同义词API用法详解,支持同义词热更新

Elasticsearch 的同义词功能非常强大,如果使用得当,可以显着提高搜索引擎的效果。使用同义词功能时的一个常见问题是更新同义词集。 同义词在搜索引擎领域用途 同义词在搜索引擎领域的用途可概括如下: 增强搜索的准确性——当用户输入一个关键词时,可能与他们实际意图相关…...

深度学习之模型权重

在深度学习中,模型的权重(weights)是指神经网络中的参数,这些参数用于调整和学习模型的行为,以便能够对输入数据进行有效的映射和提取有用的特征。深度学习模型通常由许多神经元和连接组成,而权重就是连接这…...

纯前端使用XLSX导出excel表格

1 单个sheet page.js(页面中的导出方法) import { exportExcel } from ../../../utils/exportExcel.js; leadOut() {const arr [{ id: 1, name: 张三, age: 14, sex: 男 },{ id: 2, name: 李四, age: 15, sex: 女 },{ id: 3, name: 王五, age: 16, sex: 男 },];const allR…...

将mjpg格式数转化成opencv Mat格式

该博客可以解决如下两个问题: 1、将mjpg格式数据转化成opencv Mat格式 2、v4l2_buffer 格式获取的mjpg格式数据转换成Mat格式。 要将 MJPEG 格式的数据转换为 OpenCV 的 Mat 格式,您可以使用 imdecode 函数。imdecode 函数可以将图像数据解码为 Mat 对象…...

【golang/g3n】3D游戏引擎G3N的windows安装与测试

目录 说在前面安装测试 说在前面 操作系统:win 11go version:go1.21.5 windows/amd64g3n版本:github.com/g3n/engine v0.2.0其他:找了下golang 3d相关的库,目前好像就这个比较活跃 安装 按照官方教程所说,…...

sap table 获取 valuation class MBEW 查表获取

参考 https://www.tcodesearch.com/sap-tables/search?qvaluationclass...

介绍一些操作系统—— Ubuntu 系统

介绍一些操作系统—— Ubuntu 系统 Ubuntu 系统 Ubuntu 是一个以桌面应用为主的 Linux 发行版操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu"一词,意思是“人性”“我的存在是因为大家的存在",是非洲传统的一种价值观。U…...

React中props 和 state异同初探

在 React 中,props 和 state 是两个非常重要的概念,它们决定了组件的行为和渲染方式。 Props props(属性)是父组件传递给子组件的数据。它们类似于函数的参数,可以在组件内部被访问和使用,但不能被修改。…...

spring-kakfa依赖管理之org/springframework/kafka/listener/CommonErrorHandler错误

问题: 整个项目使用spring-boot2.6.8版本,使用gradle构建,在common模块指定了implementation org.springframework.kafka:spring-kafka:2.6.8’这个工程也都能运行(这正常发送kafka消息和接收消息),但是执行…...

基于go语言开发的海量用户及时通讯系统

文章目录 二十三、海量用户即时通讯系统1、项目开发前技术准备2.实现功能-显示客户端登录菜单3.实现功能-完成用户登录-1.完成客户端可以该长度值发送消息长度,服务器端可以正常接收到-2.完成客户端可以发送消息,服务器端可以接收到消息并根据客户端发送…...

19.Oracle 中count(1) 、count(*) 和count(列名) 函数的区别

count(1) and count(字段) 两者的主要区别是 count(1) 会统计表中的所有的记录数,包含字段为null 的记录。count(字段) 会统计该字段在表中出现的次数,忽略字段为null 的情况。 即不统计字段为null 的记录。 count(*) 和 count(1)和count(列名)区别 …...

C 库函数 - time()

描述 C 库函数 time_t time(time_t *seconds) 返回自纪元 Epoch(1970-01-01 00:00:00 UTC)起经过的时间,以秒为单位。如果 seconds 不为空,则返回值也存储在变量 seconds 中。 声明 下面是 time() 函数的声明。 time_t time(t…...

基于Python数据可视化的网易云音乐歌单分析系统

目录 《Python数据分析初探》项目报告 基于Python数据可视化的网易云音乐歌单分析系统一、项目简介(一)项目背景(二)项目过程 二、项目设计流程图(一)基于Python数据可视化的网易云音乐歌单分析系统的整体…...

Jenkins----基于 CentOS 或 Docker 安装部署Jenkins并完成基础配置

查看原文 文章目录 基于 CentOS7 系统部署 Jenkins 环境基于 Docker 安装部署 Jenkins环境配置 Jenkins 中文模式配置用户名密码形式的 Jenkins 凭据配置 ssh 私钥形式的 Jenkins 凭据配置 Jenkins 执行任务的节点 基于 CentOS7 系统部署 Jenkins 环境 (1&#xff…...

flume系列之:监控flume agent channel的填充百分比

flume系列之:监控flume agent channel的填充百分比 一、监控效果二、获取flume agent三、飞书告警四、获取每个flume agent channel的填充百分比一、监控效果 二、获取flume agent def getKafkaFlumeAgent():# 腾讯云10.130.112.60zk = KazooClient(hosts...

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析,分为​​已启动​​和​​未启动​​两种场景: 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​:当其他组件(如Activity、Service)通过ContentR…...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准

城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...

tauri项目,如何在rust端读取电脑环境变量

如果想在前端通过调用来获取环境变量的值&#xff0c;可以通过标准的依赖&#xff1a; std::env::var(name).ok() 想在前端通过调用来获取&#xff0c;可以写一个command函数&#xff1a; #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...