Python-Python高阶技巧:HTTP协议、静态Web服务器程序开发、循环接收客户端的连接请求

news2025/1/23 17:31:03

版本说明

当前版本号[20231114]。

版本修改说明
20231114初版

目录

文章目录

  • 版本说明
  • 目录
  • HTTP协议
    • 1、网址
      • 1.1 网址的概念
      • 1.2 URL的组成
      • 1.3 知识要点
    • 2、HTTP协议的介绍
      • 2.1 HTTP协议的概念及作用
      • 2.2 HTTP协议的概念及作用
      • 2.3 浏览器访问Web服务器的过程
    • 3、HTTP请求报文
      • 3.1 HTTP最常见的请求报文有两种
      • 3.2 HTTP GET请求报文分析
      • 3.3 HTTP POST请求报文分析
      • 3.4 知识要点
    • 4、HTTP响应报文
      • 4.1 HTTP 响应报文分析
      • 4.2 HTTP 状态码介绍
    • 5、查看HTTP协议的通信过程
      • 5.1 谷歌浏览器开发者工具的使用
      • 5.2 查看HTTP协议的通信过程
      • 5.3 知识要点
  • 静态Web服务器程序开发
    • 6、 搭建Python自带的静态Web服务器
      • 6.1 什么是静态Web服务器?
      • 6.2 搭建Python自带的静态Web服务器
      • 6.3 访问搭建的静态Web服务器
      • 6.4 查看浏览器和搭建的静态Web服务器的通信过程
      • 6.5 知识要点
    • 7、静态Web服务器-返回固定页面数据
      • 7.1 开发自己的静态Web服务器
      • 7.2 获取浏览器的HTTP请求报文
      • 7.3 组装固定页面数据的响应报文
      • 7.4 知识要点

HTTP协议

1、网址

1.1 网址的概念

网址又称为URL,URL的英文全拼是(Uniform Resoure Locator),表达的意思是统一资源定位符,通俗理解就是网络资源地址。

URL地址:https://www.itcast.com/18/1122/10/E178J2O4000189FH.html

1.2 URL的组成

image-20230817160650795

域名IP地址的别名,它是用点进行分割使用英文字母和数字组成的名字,使用域名目的就是方便的记住某台主机IP地址。

image-20230817160734018

参数说明:? 后面的page表示第一个参数,后面的参数都使用 & 进行连接

1.3 知识要点

网址就是网络资源的地址,又称为URL,通过URL能够找到对应的资源数据。

URL组成部分

  1. 协议部分
  2. 域名部分
  3. 资源路径部分
  4. 查询参数部分[可选]

2、HTTP协议的介绍

通过HTTP协议来规定浏览器web服务器之间通讯的数据的格式

image-20230817162156559

2.1 HTTP协议的概念及作用

​ HTTP协议的全称是(HyperText Transfer Protocol),翻译过来就是超文本传输协议

​ 超文本是指在文本数据的基础上还包括非文本数据,非文本数据有图片音乐视频等,而这些非文本数据会使用链接的方式进行加载显示,通俗来说超文本就是带有链接的文本数据也就是我们常说的网页数据

image-20230817162426371

2.2 HTTP协议的概念及作用

​ HTTP协议的制作者是蒂姆·伯纳斯-李,1991年设计出来的,HTTP协议设计之前目的是传输网页数据的,现在允许传输任意类型的数据。它是浏览器和Web服务器传输数据的一个协议(HTTP)。

传输HTTP协议格式的数据是基于TCP传输协议的,发送数据之前需要先建立连接

TCP传输协议是用来保证网络中传输的数据的安全性的,HTTP协议是用来规定这些数据的具体格式的。

注意:

​ HTTP协议规定的数据格式是浏览器和Web服务器通信数据的格式,也就是说浏览器和Web服务器通信需要使用HTTP协议。

2.3 浏览器访问Web服务器的过程

注意:
HTTP协议分别规定了请求数据的格式,响应数据的格式。并且他们一般都是成对出现的

image-20230817165032356

3、HTTP请求报文

3.1 HTTP最常见的请求报文有两种

  • GET方式的请求报文
  • POST方式的请求报文

说明:

  • GET: 获取Web服务器数据
  • POST: 向Web服务器提交数据

3.2 HTTP GET请求报文分析

image-20230817165339153

---- 请求行 ----
GET /a/b/c HTTP/1.1  # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.itcast.cn  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36  # 用户代理,也就是客户端的名称
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识
---- 空行 ----
GET / HTTP/1.1\r\n
Host: www.itcast.cn\r\n  
Connection: keep-alive\r\n
Upgrade-Insecure-Requests: 1\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8\r\n
Accept-Encoding: gzip, deflate\r\n
Accept-Language: zh-CN,zh;q=0.9\r\n
Cookie: pgv_pvi=1246921728; \r\n
\r\n  (请求头信息后面还有一个单独的’\r\n’不能省略)

说明:

每项数据之间使用:\r\n

3.3 HTTP POST请求报文分析

image-20230817165536404

---- 请求行 ----
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1 # POST请求方式 请求资源路径 HTTP协议版本
---- 请求头 ----
Host: mail.itcast.cn # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Content-Type: application/x-www-form-urlencoded  # 告诉服务端请求的数据类型
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客户端的名称
---- 空行 ----
---- 请求体 ----
username=hello&pass=hello # 请求参数
POST /xmweb?host=mail.itcast.cn&_t=1542884567319 HTTP/1.1\r\n
Host: mail.itcast.cn\r\n
Connection: keep-alive\r\n
Content-Type: application/x-www-form-urlencoded\r\n
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36\r\n
\r\n(请求头信息后面还有一个单独的’\r\n’不能省略)
username=hello&pass=hello

说明:

每项数据之间使用:\r\n

3.4 知识要点

image-20230817165658922

4、HTTP响应报文

4.1 HTTP 响应报文分析

响应行是由三部分组成:HTTP协议版本 状态码 状态描述

image-20230905203835521

--- 响应行/状态行 ---
HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---
--- 响应体 ---
<!DOCTYPE html><html lang=“en”></html> # 响应给客户端的数据

4.2 HTTP 状态码介绍

状态码是用于表示Web服务器响应状态的3位数字代码

最常见的状态码是200

image-20230905204336155

5、查看HTTP协议的通信过程

5.1 谷歌浏览器开发者工具的使用

​ 安装Google Chrome浏览器,在Windows和Linux平台按F12调出开发者工具, Mac中选择“视图 ->开发者 ->”开发者工具或者直接使用 alt+command+i 这个快捷键,还有一个多平台通用的操作就是在网页右击选择检查

提示:开发者工具还是查看网页布局和JS代码调试的利器。

image-20230905205428651

​ 注意:每一次浏览器和服务器的数据通讯,都是成对出现的即请求和响应,同时每一次请求和响应都必须符合HTTP协议的格式。

image-20230905205640436

标签选项说明:
元素(Elements):用于查看或修改HTML标签
控制台(Console):执行JS代码
源代码(Sources):查看静态资源文件,断点调试JS代码
网络(Network):查看http协议的通信过程

image-20230905205851207

使用说明:

  1. 点击Network标签选项
  2. 在浏览器地址栏输入百度的网址,就能看到请求百度首页的HTTP的通信过程
  3. 这里的每项记录都是请求+响应的一次过程

5.2 查看HTTP协议的通信过程

image-20230905210108794

image-20230905210201907

image-20230905210209589

image-20230905210217238

5.3 知识要点

​ 谷歌浏览器的开发者工具是查看http协议的通信过程利器,通过Network标签选项可以查看每一次的请求和响应的通信过程,调出开发者工具的通用方法是在网页右击选择检查。

Headers选项总共有三部分组成:

①General: 主要信息

②Response Headers: 响应头

③Request Headers: 请求头

Response选项是查看响应体信息的

静态Web服务器程序开发

6、 搭建Python自带的静态Web服务器

6.1 什么是静态Web服务器?

可以为发出请求的浏览器提供静态文档的程序

​ 平时我们浏览百度新闻数据的时候,每天的新闻数据都会发生变化,那访问的这个页面就是动态的,而我们开发的是静态的,每天访问我们自己的静态web服务器,页面的数据不会发生变化。

6.2 搭建Python自带的静态Web服务器

image-20230905211844101

​ -m表示运行包里面的模块,执行这个命令的时候,需要进入你自己指定静态文件的目录,然后通过浏览器就能访问对应的html文件了,这样一个静态的web服务器就搭建好了。

6.3 访问搭建的静态Web服务器

访问Web服务器:

image-20230905212133929

6.4 查看浏览器和搭建的静态Web服务器的通信过程

HTTP的通信过程:

image-20230905212213646

6.5 知识要点

​ 静态Web服务器是为发出请求的浏览器提供静态文档的程序,搭建Python自带的Web服务器使用 python3 –m http.server 端口号这个命令即可,端口号不指定默认是8000

image-20230905212335786

强调!应答体中携带的数据发送到浏览器,浏览器经过渲染产生具体页面.

7、静态Web服务器-返回固定页面数据

7.1 开发自己的静态Web服务器

开发步骤:

  1. 编写一个TCP服务端程序。
  2. 获取浏览器发送的HTTP请求报文数据。
  3. 读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。
  4. HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

TCP服务端程序代码:

import socket
# 创建tcp服务端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置socket选项,立即释放端口
tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
# 绑定端口号
tcp_server_socket.bind((“”, 9090))
# 设置监听
tcp_server_socket.listen(128)
# 循环接收客户端的连接请求
while True:
conn_socket, ip_port = tcp_server_socket.accept()

7.2 获取浏览器的HTTP请求报文

import socket
# 创建tcp服务端套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 中间代码省略……
# 循环接收客户端的连接请求
while True:
conn_socket, ip_port = tcp_server_socket.accept()
# 获取客户端的请求报文数据
client_request_data = conn_socket.recv(4096)
print(client_request_data)

7.3 组装固定页面数据的响应报文

# 使用rb的原因是浏览器也有可能请求的是图片
with open(“index.html”, “rb”) as file:
file_data = file.read()
response_line = “HTTP/1.1 200 OK\r\n” # 响应行
# 响应头
response_header = "Server: PWS1.0\r\nContent-Type: text/html;charset=utf-8\r\n"
response_body = file_data # 响应体
# 拼接响应报文数据
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
# 发送响应报文数据
conn_socket.send(response_data)
conn_socket.close()

7.4 知识要点

  1. 编写一个TCP服务端程序
 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  # 循环接收客户端的连接请求
	while True:
conn_socket, ip_port = tcp_server_socket.accept()
  1. 获取浏览器发送的http请求报文数据
 client_request_data = conn_socket.recv(4096)
  1. 读取固定页面数据,把页面数据组装成HTTP响应报文数据发送给浏览器。
response_data = (response_line + response_header + "\r\n").encode("utf-8") + response_body
 conn_socket.send(response_data)
  1. HTTP响应报文数据发送完成以后,关闭服务于客户端的套接字。
 conn_socket.close()

后续待补充!

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

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

相关文章

深入学习 Android Framework 之 SystemServer 进程启动详解

深入学习 Android Framework 第三&#xff1a;深入学习 Android Framework 之 SystemServer 进程启动详解 文章目录 深入学习 Android Framework前言一、Android 系统的启动流程1. 流程图2. 启动流程概述 二、源码详解1. 时序图2. 源代码1、ZygoteInit # main()2、ZygoteInit …

Ubuntu 17.10 “Artful Aardvark” 发布首个 Beta

Ubuntu 17.10 “Artful Aardvark” 首个 Beta 版已发布。 按照 Ubuntu 17.10 的发布日程 &#xff0c;Ubuntu 17.10 首个 beta 版按时发布了。不过参与本次测试版的没有 Ubuntu 官方风味版本&#xff08;要尝试的话可以考虑每日构建 ISO&#xff09;&#xff0c;包括了 Kubunt…

MySQL学习day02

一、SQL通用语法 1&#xff09;SQL语句可以单行或多行书写&#xff0c;以分号结尾 2&#xff09;SQL语句可以使用空格/缩进来增强语句的可读性 3&#xff09;MySQL数据库的SQL语句不区分大小写&#xff0c;关键字建议使用大写 4&#xff09;注释&#xff1a; a)单行注释&#x…

Day30力扣打卡

打卡记录 最长回文子序列&#xff08;区间DP&#xff09; 链接 class Solution:def longestPalindromeSubseq(self, s: str) -> int:n len(s)f [[0] * n for _ in range(n)]max lambda x, y: x if x > y else yfor i in range(n - 1, -1, -1):f[i][i] 1for j in ra…

leetcode二分查找算法题

目录 1.二分查找2.在排序数组中查找元素的第一个和最后一个位置3.x的平方根4.搜索插入位置5.山脉数组的峰顶索引6. 寻找峰值7.寻找旋转排序数组中的最小值8.8.0~n-1中缺失的数字 1.二分查找 二分查找 class Solution { public:int search(vector<int>& nums, int …

掉瓶子小游戏

欢迎来到程序小院 掉瓶子 玩法&#xff1a;旋转的瓶子&#xff0c;根据瓶子方向&#xff0c;点击鼠标左键瓶子掉落&#xff0c;从桌面中间掉下即得1分&#xff0c;卡在桌边瓶子碎了游戏结束&#xff0c;快去掉瓶子吧^^。开始游戏https://www.ormcc.com/play/gameStart/203 htm…

第1关:简单查询

任务描述相关知识 检索数据表的内容编程要求测试说明 任务描述 本关任务&#xff1a; 用 SELECT 语句检索数据表中指定字段的数据&#xff1b; 用 SELECT 语句检索数据表中所有字段的数据。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.如何获取数据表…

从0到0.01入门 Webpack| 001.精选 Webpack面试题

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

深度学习 植物识别算法系统 计算机竞赛

文章目录 0 前言2 相关技术2.1 VGG-Net模型2.2 VGG-Net在植物识别的优势(1) 卷积核&#xff0c;池化核大小固定(2) 特征提取更全面(3) 网络训练误差收敛速度较快 3 VGG-Net的搭建3.1 Tornado简介(1) 优势(2) 关键代码 4 Inception V3 神经网络4.1 网络结构 5 开始训练5.1 数据集…

Python基础入门----使用Pipenv工具时产生的Pipfile和Pipfile.lock文件有什么区别以及有什么作用

文章目录 PipfilePipfile.lock实操示例当我们使用 Pipenv 工具进行 Python 项目的依赖管理时,会遇到两个重要的文件:Pipfile 和 Pipfile.lock。这两个文件在项目中扮演着不同但又相互补充的角色。接下来,我将详细介绍这两个文件的区别和作用,并提供一些具体的使用示例。 P…

机器视觉系统中工业光源选型避坑指南

光源的作用&#xff1a; 照亮目标&#xff0c;提高目标亮度 形成有利于图像处理的效果&#xff0c;提升对比度 克服环境光干扰&#xff0c;保证图像的稳定性 光源的选型思路&#xff1a; ①颜色 ②外形  ③打光方式  ④亮度 选颜色 通过选择合适颜色的光源&#xff0c;…

城市内涝对策,万宾科技内涝积水监测仪使用效果

随着城市化进程的加速&#xff0c;城市道路积水问题明显越来越多&#xff0c;给人们的出行和生活带来更多的不便。内涝积水监测仪作为高科技产品能够实时监测道路积水情况&#xff0c;为城市排水系统的管理和维护提供重要的帮助。 在城市生命线的基础设施规划之中&#xff0c;地…

(论文阅读32/100)Flowing convnets for human pose estimation in videos

32.文献阅读笔记 简介 题目 Flowing convnets for human pose estimation in videos 作者 Tomas Pfister, James Charles, and Andrew Zisserman, ICCV, 2015. 原文链接 https://arxiv.org/pdf/1506.02897.pdf 关键词 Human Pose Estimation in Videos 研究问题 视频…

并发编程由浅及深(一)

并发编程重要吗&#xff1f;当然重要&#xff0c;因为并发在我们的项目中真实存在&#xff0c;如果你不能充分了解它那么很可能造成严重的生产事故。最近隔壁项目组出了一个问题&#xff0c;每次请求接口之后都发现线程固定增加了5个&#xff0c;而且线程数一直增加没有减少&am…

【Java笔试强训】Day11(CM24 最近公共祖先、HJ86 求最大连续bit数)

CM24 最近公共祖先 链接&#xff1a;最近公共祖先 题目&#xff1a; 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号&#xff0c;根结点编号为1。现给定a&#xff0c;b为两个结点。设计一个算法&#xff0c;返回a、b最近的公共祖先的编号。注意其祖先也可能是结…

CodeWhisperer 使用经验分享

今天给大家分享一下 Amazon CodeWhisperer 编程工具&#xff08;免费哦&#xff09;&#xff0c;使用这个软件后我的编码质量提升不少&#xff0c;给大家分享一下我的经验。希望大家支持哦。 Amazon CodeWhisperer 是亚⻢逊出品的一款基于机器学习的 AI 编程助手&#xff0c;可…

No210.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

软件测试/测试开发丨​利用人工智能ChatGPT批量生成测试数据

点此获取更多相关资料 简介 测试数据是指一组专注于为测试服务的数据&#xff0c;既可以作为功能的输入去验证输出&#xff0c;也可以去触发各类异常场景。 测试数据的设计尤为重要&#xff0c;等价类、边界值、正交法等测试用例设计方法都是为了更全面地设计对应的测试数据…

大数据Doris(二十二):数据查看导入

文章目录 数据查看导入 数据查看导入 Broker load 导入方式由于是异步的,所以用户必须将创建导入的 Label 记录,并且在查看导入命令中使用 Label 来查看导入结果。查看导入命令在所有导入方式中是通用的,具体语法可执行 HELP SHOW LOAD 查看。 show load order by create…

三大开源向量数据库大比拼

向量数据库具有一系列广泛的好处&#xff0c;特别是在生成式人工智能方面&#xff0c;更具体地说&#xff0c;是在大语言模型&#xff08;LLM&#xff09;方面。这些好处包括先进的索引和精确的相似度搜索&#xff0c;有助于交付强大的先进项目。 本文将对三种开源向量数据库&…