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

PythonWeb服务器(HTTP协议)

一、HTTP协议与实现原理

        HTTP(Hypertext Transfer Protocol,超文本传输协议)是一种用于在网络上传输超文本数据的协议。它是Web应用程序通信的基础,通过客户端和服务器之间的请求和响应来传输数据。在HTTP协议中连接客户与服务器的方式分为非持续连接和持续连接。

        它是一种无状态的协议,意味着每个HTTP请求都是独立的,服务器不会记住之前的请求。

HTTP的实现原理可以概括为以下几个步骤:

  1. 建立连接:客户端通过TCP/IP协议与服务器建立连接。HTTP使用默认的端口号80进行通信,但也可以使用其他端口号。

  2. 发送请求:客户端向服务器发送HTTP请求。请求由请求行、请求头和请求体组成。请求行包含请求方法(GET、POST等)、请求的URL和协议版本。请求头包含关于请求的附加信息,例如用户代理、Cookies等。请求体包含请求所需的数据,例如表单数据或上传的文件。

  3. 处理请求:服务器接收到请求后,根据请求的URL和方法,处理请求并生成响应。处理请求的方式可以是执行脚本、读取文件、查询数据库等。

  4. 发送响应:服务器生成HTTP响应,并将其发送回客户端。响应由响应行、响应头和响应体组成。响应行包含响应的状态码和状态消息。响应头包含关于响应的附加信息,例如内容类型、缓存控制等。响应体包含响应的实际内容,例如HTML页面、图片等。

  5. 关闭连接:一旦响应发送完毕,服务器关闭与客户端的连接。如果客户端需要更多资源,它可以再次发起新的HTTP请求。

        HTTP的实现依赖于底层的TCP/IP协议,它负责在网络上可靠地传输数据。HTTP使用明文传输数据,因此不适合传输敏感信息。为了增加安全性,可以使用HTTPS(HTTP Secure)协议,它在HTTP和TCP/IP之间添加了SSL/TLS加密层。

        在HTTP协议中连接客户与服务器的方式分为非持续连接持续连接

1.1  非持续连接

        客户向服务器发出的一系列请求以有规律的间隔性地或间断性地一个接一个发出,这种连接服务器的方式称之为非持续连接。

例:

       现在有一个客户访问一个网页,假设该网页由1个HTML文件和10个JPEC图形组成,并且这十一个对象在同一台服务器上。进一步假设HTML文件的URL为http://www.someSchool.edu/someDepartment/home.index

访问的过程中由以下流程组成:

(1)HTTP客户进程在端口号80(默认端口)发起一个到服务器www.somSchool.edu的TCP连接

(2)HTTP客户经它的套接字(socket)向服务器发送一个HTTP请求报文

(3)HTTP服务器进程经它的套接字接受该请求报文,从其存储器(RAW或磁盘)中检索出对象someDepartment/home.index,在一个HTTP响应报文中封装对象,并通过其套接字向用户发送响应报文。

(4)HTTP客户接收到响应报文,TCP关闭。

以上操作产生11个TCP连接才能返回一个完整的网页。

1.2 持续连接

        非持续连接有一些缺点:(1)必须为每一个请求的对象创建一个全新的TCP连接,给web服务器带来了巨大的负担(2)需要经受两倍RTT的交付时延(一个RTT用于创建TCP,另一个RTT用于请求和接收一个对象)

        针对以上两个缺点,开发人员对HTTP的连接方式进行了改进。即每一个请求/响应都通过同一个TCP连接进行发送。

        在非持续连接的例子中表现为没有步骤(4)中的“ TCP关闭 ”,后续的请求和响应仍然通过这个TCP进行发送。

1.3 HTTP报文格式

以下是两个典型的HTTP报文实例:

1.请求报文

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.212 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9

求的目标是/index.html页面。请求头部字段包括HostUser-AgentAcceptAccept-EncodingAccept-Language等。

2.响应报文

HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Content-Length: 1274
Date: Mon, 24 May 2021 10:00:00 GMT
Server: Apache/2.4.18 (Ubuntu)<!DOCTYPE html>
<html>
<head><title>Example Page</title>
</head>
<body><h1>Welcome to the Example Page</h1><p>This is a sample HTML page.</p>
</body>
</html>

这是一个状态码为200的响应报文,表示请求成功。响应头部字段包括Content-TypeContent-LengthDateServer等。响应体是一个HTML页面,包含标题和段落内容。

上面提到的头部字段用于提供请求或响应的附加信息。

常见的请求报文头部字段包括:

  1. 请求行:包括请求方法(GET、POST等)、请求的URL以及HTTP协议的版本号。
  2. Host:指定请求的主机名,用于虚拟主机的识别。
  3. User-Agent:发送请求的用户代理标识,用于标识客户端的软件、硬件和操作系统信息。
  4. Accept:指定客户端可接受的媒体类型(MIME类型)。
  5. Accept-Encoding:指定客户端可接受的内容编码方式,如gzip、deflate等。
  6. Accept-Language:指定客户端可接受的自然语言。
  7. Connection:指定是否保持连接。
  8. Content-Type:指定请求体的媒体类型。

常见的响应报文头部字段包括:

  1. 状态行:包括HTTP协议的版本号、状态码以及状态消息。
  2. Server:指定响应的服务器软件信息。
  3. Content-Type:指定响应体的媒体类型。
  4. Content-Length:指定响应体的长度。
  5. Content-Encoding:指定响应体的内容编码方式。
  6. Set-Cookie:设置响应的Cookie信息。
  7. Location:指定重定向的URL。
  8. Cache-Control:指定缓存控制策略。

1.4 cookie

        用户与服务器交互中,cookie是一种用于存储用户信息的小文件。当用户访问一个网站时,服务器会通过HTTP响应的头部将一个cookie发送给用户的浏览器。浏览器将cookie保存起来,并在用户下次访问该网站时,将cookie发送给服务

Cookie技术中有4大组件:

  1. Cookie Manager:负责管理和维护浏览器中存储的Cookie。它可以允许用户查看、添加、编辑和删除Cookie,并提供一些高级功能,如导出和导入Cookie数据。

  2. Cookie Parser:负责解析HTTP请求中的Cookie。它将请求头中的Cookie字段解析为Cookie对象,使服务器能够轻松地提取和使用Cookie数据。

  3. Cookie Serializer:负责将服务器上的Cookie序列化为HTTP响应头中的Cookie字段。它将Cookie对象转换符合HTTP协议规范的格式,以便浏览器能够正确地处理和存储Cookie。

  4. Cookie Storage:负责实际存储和管理Cookie数据。可以将Cookie数据保存在浏览器的本地存储中,以便在后续的请求中使用。Cookie Storage还可以提供一些额外的功能,如设置Cookie的过期时间、域名和路径等。

二、python实现WEB服务器

在python中可以通过http.server模块实现简单的WEB服务器:

rom http.server import HTTPServer, BaseHTTPRequestHandler# 创建一个自定义的请求处理类,继承自BaseHTTPRequestHandler
class MyRequestHandler(BaseHTTPRequestHandler):# 处理GET请求def do_GET(self):# 设置响应状态码为200(表示成功)self.send_response(200)# 设置响应头self.send_header('Content-type', 'text/html')self.end_headers()# 构造响应内容response = '<h1>Hello, World!</h1>'# 发送响内容self.wfile.write(response.encode())# 创建一个HTTP服务器实例,并指定请求处理类
server = HTTPServer(('localhost', 8000), MyRequestHandler)
# 启动服务器
server.serve_forever()

以上代码会创建一个简单的WEB服务器,监听本地8000端口,收到GET请求时会返回一个包含<h1>Hello, World!</h1>的HTML响应。

相关文章:

PythonWeb服务器(HTTP协议)

一、HTTP协议与实现原理 HTTP&#xff08;Hypertext Transfer Protocol&#xff0c;超文本传输协议&#xff09;是一种用于在网络上传输超文本数据的协议。它是Web应用程序通信的基础&#xff0c;通过客户端和服务器之间的请求和响应来传输数据。在HTTP协议中连接客户与服务器的…...

Northstar 量化平台

基于 B/S 架构、可替代付费商业软件的一站式量化交易平台。具备历史回放、策略研发、模拟交易、实盘交易等功能。兼顾全自动与半自动的使用场景。 已对接国内期货股票、外盘美股港股。 面向程序员的量化交易软件&#xff0c;用于期货、股票、外汇、炒币等多种交易场景&#xff…...

c语言进阶部分详解(经典回调函数qsort()详解及模拟实现)

大家好&#xff01;上篇文章&#xff08;c语言进阶部分详解&#xff08;指针进阶2&#xff09;_总之就是非常唔姆的博客-CSDN博客&#xff09;我已经对回调函数进行了初步的讲解和一个简单的使用事例&#xff0c;鉴于篇幅有限没有进行更加详细的解释&#xff0c;今天便来补上。…...

win下 lvgl模拟器codeblocks配置

链接: 官方lvgl的codeblocks官方例子 下载慢的话&#xff0c;可能需要点工具。 需要下载的东西 https://github.com/lvgl/lv_port_win_codeblocks https://github.com/lvgl/lv_drivers/tree/4f98fddd2522b2bd661aeec3ba0caede0e56f96b https://github.com/lvgl/lvgl/tree/7a23…...

Quartus出租车计价器VHDL计费器

名称&#xff1a;出租车计价器VHDL计费器 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 启动键start表示汽车启动&#xff0c;起步价7元&#xff0c;同时路程开始计数&#xff0c;停止键stop表示熄火&#xff0c;车费和路程均为0&#xff0c;当暂停键pa…...

浅谈单元测试:测试和自动化中的利用

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 浅谈单元测试是一件棘手的事情。我很确定测试人员在某个时候会抱怨开发人员没有正确地进行单元测试&…...

深度详解Java序列化

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

Linux下的网络编程——B/S模型HTTP(四)

前言&#xff1a; HTTP是基于B/S架构进行通信的&#xff0c;而HTTP的服务器端实现程序有httpd、nginx等&#xff0c;其客户端的实现程序主要是Web浏览器&#xff0c;例如Firefox、Internet Explorer、Google Chrome、Safari、Opera等&#xff0c;此外&#xff0c;客户端的命令…...

Go语言入门篇

目录 一、基础数据类型 1.1 变量的定义方式 1.2 用%T输出变量的类型 二、复合数据类型 2.1 数组 2.1.2、数组的遍历 2.1.3 数组传参 2.2. 切片slice 2.2.1. 初始化切片 2.2.2. append向切片中追加元素 2.2.3. 切片的截取 2.3. map 2.3.1. map初始化 2.3.2. 添加和…...

基于springboot+vue的青年公寓服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…...

Spring-ImportSelector接口功能介绍

ImportSelector接口是至spring中导入内部类或者外部类的核心接口&#xff0c;只需要其定义的方法内返回需要创建bean的class字符串就好了&#xff0c;比如&#xff1a;当我们引入一个外部share包&#xff0c;我们拿到里面的Class返回出去&#xff0c;就能得到这个bean,是多么神…...

YOLOv5如何训练自己的数据集

文章目录 前言1、数据标注说明2、定义自己模型文件3、训练模型4、参考文献 前言 本文主要介绍如何利用YOLOv5训练自己的数据集 1、数据标注说明 以生活垃圾数据集为例子 生活垃圾数据集&#xff08;YOLO版&#xff09;点击这里直接下载本文生活垃圾数据集 生活垃圾数据集组成&…...

李航老师《统计学习方法》第1章阅读笔记

1.1 统计学习 统计学习的特点 统计学习&#xff1a;计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析 现在人们提及机器学习时&#xff0c;往往指统计机器学习&#xff0c;所以可以认为本书介绍的是机器学习方法 统计学习的对象 统计学习研究的对象是数据(data)…...

基于微信小程序的背单词学习激励系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言用户微信端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉…...

VScode调试复杂C/C++项目

以前都是用的VScode调试c/cpp的单个文件的编译和执行, 但是一遇到大型项目一般就用gdb了, gdb的调试效率和VScode差距还是比较大的, 但最近发现VScode其实也能调试复杂的cpp项目, 所以记录一下. 首先明确一下几点: 首先cpp文件需要经过编译, 生成可执行文件, 然后通过运行/调…...

【Hash表】字母异位词分组-力扣 49 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…...

展示日志log4.properties

log4.properties 1.log4.properties 此时文件主要用于展示日志的输出的级别的信息。 # Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategoryINFO, CONSOLE debug info warn error fatal log4j.rootCategoryinfo, CONSO…...

基于PLE结合卡尔曼滤波的RSSI定位算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 ............................................................... for Num_xb Num_xb2Num_…...

uniapp项目实践总结(十九)版本更新和热更新实现方法

导语:当一个 APP 应用开发完成以后,就要上架应用商店,但有时候修改一些小问题或者推出一些活动,又不想频繁地提交应用商店审核,那么就可以使用应用内更新功能来进行应用的版本升级更新或热更新,下面就介绍一下实现的方法。 目录 准备工作原理分析实战演练案例展示准备工作…...

一起学数据结构(8)——二叉树中堆的代码实现

在上篇文章中提到&#xff0c;提到了二叉树中一种特殊的结构——完全二叉树。对于完全二叉树&#xff0c;在存储时&#xff0c;适合使用顺序存储。对于非完全二叉树&#xff0c;适合用链式存储。本文将给出完全二叉树的顺序结构以及相关的代码实现&#xff1a; 1. 二叉树的结构…...

Android Wi-Fi 连接失败日志分析

1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分&#xff1a; 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析&#xff1a; CTR…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...