网络:手写HTTP

news2025/7/16 14:04:42

目录

一、HTTP是应用层协议

二、HTTP服务器

三、HTTP服务

认识请求中的uri

HTTP支持默认首页

响应 

功能完善

套接字复用


一、HTTP是应用层协议

HTTP下层是TCP协议,站在TCP的角度看,要提供的服务是HTTP服务。

这是在原来实现网络版计算器时,实现的TCPServer.hpp,在TCP上层是HttpServer时,为了方便代码阅读,修改上层服务的命名为http_server。

对于HTTP服务,接收一次请求字符串,做出一次响应。 

在TCP处理服务时,每个线程要做的内容。

 

为什么要这样处理,不同于网络版计算器。

1.由于TCP面向字节流,不管上层是什么服务(协议),都可能会出现读取到一个不完整请求的情况(黏包问题),所以,在网络版计算器实现时,添加了对协议的解析过程,比如内容长度、\r\n的分割等内容,标识可以有效的帮助我们对收到的请求做处理,确保至少有一个完整的请求。

2.对于HTTP,其实有较大的概率,能得到一个完整的请求,因此,不再添加对HTTP的黏包处理过程。

二、HTTP服务器

简单的搭建一个HTTP服务器,用Windows浏览器访问,查看HTTP请求格式。

我们可以简单的把HTTP的请求在服务器端直接打印出来。

接下来开始正式完成Http主体内容。

我们手写的HTTP服务的主要任务是序列化和反序列化这个过程。因此,如何保证HTTP要服务的字符串是一个完整的请求,并不详细的再去用代码实现。

三、HTTP服务

  • 一个HTTP服务中,有HTTP请求和HTTP响应。

  • 由一个完整的string转化为类成员变量,即结构化数据,这个过程就是反序列化。

  • 智能指针管理资源——RAII

  •  可以轻松的得到请求行。

  • 对应请求头和请求内容,相对复杂。 

  • 进一步反序列化,获取更加详细的信息 

  • 解析请求行 

  • 解析请求头

在Print函数中添加解析后打印的代码

认识请求中的uri

请求中没有指明某一个服务器资源时,请求的默认就是 /

HTTP支持默认首页

请求/ 并不表示请求服务器的根目录,这个根目录表示的是Web根目录。

  • 一般在实现服务器的同路径下,有一个保存客户端请求资源的目录,叫做wwwroot,即Web根目录,请求/,即表示请求wwwroot。
  • HTTP支持默认首页,所以每一个资源目录下都有index.html。

基于以上两点,请求/本质是请求HTTP服务下的 ./wwwroot/index.html。

  • 修改代码

 

  • 拼接首页 

 

  • 实际资源与url解耦合,我们可以自己定义path 

响应 

  • Linux支持telnet,可以自己构建完整请求。 

  • 服务器的工作是收到序列化的请求,把他反序列化后解析,按照请求构造一个序列化的响应 

因此,我们所写HTTP服务响应只有序列化的功能。

  •  详细字段

  •   序列化函数

  •  整理一个资源
  • Content-Type映射表

 

 

 

功能完善

  • 套接字复用

 

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

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

相关文章

【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析

基于YOLOv5的人脸检测与关键点定位系统深度解析 1. 技术背景与项目意义传统方案的局限性YOLOv5多任务方案的优势 2. 核心算法原理网络架构改进关键点回归分支损失函数设计 3. 实战指南:从环境搭建到模型应用环境配置数据准备数据格式要求数据目录结构 模型训练配置文…

【python】如何将python程序封装为cpython的库

python程序在发布时,往往会打包为cpython的库,并且根据应用服务器的不同架构(x86/aarch64),以及python的不同版本,封装的输出类型也是非常多。本文介绍不同架构指定python下的代码打包方式: 首…

计算机组成原理 课后练习

例一: 例二: 1. 原码一位乘 基本原理 原码是一种直接表示数值符号和大小的方式:最高位为符号位(0表示正,1表示负),其余位表示数值的绝对值。原码一位乘的核心思想是逐位相乘,并通…

SVN仓库突然没有权限访问

如果svn仓库突然出现无法访问的情况,提示没有权限,所有账号都是如此,新创建的账号也不行。 并且会突然提示要输入账号密码。 出现这个情况时,大概率库里面的文件有http或者https的字样,因为单独给该文件添加权限导致…

【Qt】文件

🌈 个人主页:Zfox_ 🔥 系列专栏:Qt 目录 一:🔥 Qt 文件概述 二:🔥 输入输出设备类 三:🔥 文件读写类 四:🔥 文件和目录信息类 五&…

【AI】[特殊字符]生产规模的向量数据库 Pinecone 使用指南

一、Pinecone 的介绍 Pinecone是一个完全托管的向量数据库服务,专为大规模机器学习应用设计。它允许开发者轻松存储、搜索和管理高维向量数据,为推荐系统、语义搜索、异常检测等应用提供强大的基础设施支持。 1.1 Pinecone的核心特性 1. 高性能向量搜…

dstream

DStream转换DStream 上的操作与 RDD 的类似,分为 Transformations(转换)和 Output Operations(输出)两种,此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform(…

HFSS5(李明洋)——设置激励(波端口激励)

Magnetic是适用于铁磁氧导体的,只有前三种激励类型可以用于计算S参数 1波端口激励 也可以设置在模型内部,如果是设置在模型内部必须加一段理想导体,用于指定端口方向 1.1——模式 number 输入N:计算1-N的模式都计算 1.2——模式…

ubiquant比赛系列——用docker准备ubipoker开发环境

比赛过程: 环境准备: #在云服务器上拉python官方的docker镜像并下载到本地 https://hub.docker.com/_/python/ sudo docker pull python:3.11.12-slim-bullseye sudo docker images sudo docker save -o 3.11.12-slim-bullseye.tar python:3.11.12-slim…

Rust实现高性能目录扫描工具ll的技术解析

Rust实现高性能目录扫描工具ll的技术解析 一、项目概述 本项目使用Rust构建了一个类ls命令行工具,具备以下核心特性: 多格式文件信息展示并行目录扫描加速人类可读文件大小运行时性能统计交互式进度提示 二、技术架构 1. 关键技术栈 clap&#xff…

深入理解C语言变量:从基础到实践

在编程世界中,变量是最基础也是最重要的概念之一。作为C语言的核心组成部分,变量承载着程序运行时数据的存储和传递功能。理解变量的工作原理和正确使用方法,是成为一名合格C程序员的必经之路。本文将全面介绍C语言变量的各个方面&#xff0c…

RK3562/3588 系列之0—NPU基础概念

RK3562/3588 系列之0—NPU基础概念 1.处理器分类2.算力衡量指标TOPS参考文献 1.处理器分类 中央处理器(CPU); 图形处理器 (GPU); 神经网络处理器(NPU)。 每个处理器擅长不同的任务:CPU擅长顺序控制和即时性;GPU适合并行数据流处理,NPU擅长…

canvas画板!随意画!!

希望你天天开心 代码&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>绘画板</title…

Float32、Float16、BFloat16

我们先介绍 Float32、Float16、BFloat16 的 浮点数表示方法 然后根据浮点数表示&#xff0c;来分析总结他们是怎么控制 精度和 数值范围 的 最后再来对比的说明 Float32、Float16、BFloat16 的 应用场景 和 硬件支持 1、浮点数的表示方法 Float32 &#xff1a; 单精度浮点数…

5V 1A充电标准的由来与技术演进——从USB诞生到智能手机时代的电力革命

点击下面图片带您领略全新的嵌入式学习路线 &#x1f525;爆款热榜 88万阅读 1.6万收藏 一、起源&#xff1a;USB标准与早期电力传输需求 1. USB的诞生背景 1996年&#xff0c;由英特尔、微软、IBM等公司组成的USB-IF&#xff08;USB Implementers Forum&#xff09;发布了…

微信小程序蓝牙连接打印机打印单据完整Demo【蓝牙小票打印】

文章目录 一、准备工作1. 硬件准备2. 开发环境 二、小程序配置1. 修改app.json 三、完整代码实现1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令说明五、测试流程六、常见问题解决七、进一步优化建议 下面我将提供一个完整的微信…

龙虎榜——20250425

指数依然在震荡&#xff0c;等待方向选择&#xff0c;整体量能不搞但个股红多绿少。 2025年4月25日龙虎榜行业方向分析 一、核心主线方向 绿色电力&#xff08;政策驱动业绩弹性&#xff09; • 代表标的&#xff1a;华银电力&#xff08;绿电运营&#xff09;、西昌电力&…

计算机组成原理:指令系统

计算机组成原理:指令集系统 指令集体系结构(ISA)ISA定义ISA包含的内容举个栗子指令的基本组成(操作码+地址码)指令分类:地址码的个数定长操作码变长操作码变长操作码的原则变长操作码的设计指令寻址寻址方式的目的寻址方式分类有效地址直接在指令中给出有效地址间接给出有效地…

【Go语言】RPC 使用指南(初学者版)

RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;允许程序调用另一台计算机上的子程序&#xff0c;就像调用本地程序一样。Go 语言内置了 RPC 支持&#xff0c;下面我会详细介绍如何使用。 一、基本概念 在 Go 中&…

Python----深度学习(基于深度学习Pytroch簇分类,圆环分类,月牙分类)

一、引言 深度学习的重要性 深度学习是一种通过模拟人脑神经元结构来进行数据学习和模式识别的技术&#xff0c;在分类任务中展现出强大的能力。 分类任务的多样性 分类任务涵盖了各种场景&#xff0c;例如簇分类、圆环分类和月牙分类&#xff0c;每种任务都有不同的…