python中HTTP协议和静态Web服务器(1)

现在能在网上找到很多很多的学习资源,有免费的也有收费的,当我拿到1套比较全的学习资源之前,我并没着急去看第1节,我而是去审视这套资源是否值得学习,有时候也会去问一些学长的意见,如果可以之后,我会对这套学习资源做1个学习计划,我的学习计划主要包括规划图和学习进度表。

分享给大家这份我薅到的免费视频资料,质量还不错,大家可以跟着学习

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

1.HTTP 协议的介绍

在这里插入图片描述

2.HTTP 协议的作用

在这里插入图片描述

3.浏览器访问web服务器的通信过程

在这里插入图片描述

4.小结

在这里插入图片描述

二、URL


1.URL的概念

在这里插入图片描述

2.URL的组成

在这里插入图片描述

3.小结

在这里插入图片描述

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


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

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.查看HTTP协议的通信过程

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.小结

在这里插入图片描述

四、HTTP 请求报文


1.HTTP 请求报文介绍

在这里插入图片描述

2.HTTP GET 请求报文分析

在这里插入图片描述

GET 请求报文说明:

---- 请求行 ----

GET / 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 请求原始报文说明:

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.HTTP POST 请求报文分析

在这里插入图片描述

在这里插入图片描述

POST 请求报文说明:

---- 请求行 ----

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 请求原始报文说明:

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

4.小结

在这里插入图片描述

五、HTTP响应报文


1.HTTP响应报文分析

在这里插入图片描述

在这里插入图片描述

响应报文说明:

— 响应行/状态行 —

HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述

— 响应头 —

Server: Tengine # 服务器名称

Content-Type: text/html; charset=UTF-8 # 内容类型

Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。

Connection: keep-alive # 和客户端保持长连接

Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间

— 空行 —

— 响应体 —

… # 响应给客户端的数据

原始响应报文说明:

HTTP/1.1 200 OK\r\n

Server: Tengine\r\n

Content-Type: text/html; charset=UTF-8\r\n

Transfer-Encoding: chunked\r\n

Connection: keep-alive\r\n

Date: Fri, 23 Nov 2018 02:01:05 GMT\r\n

\r\n(响应头信息后面还有一个单独的’\r\n’不能省略)

说明:

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

2.HTTP 状态码介绍

在这里插入图片描述

3.小结

在这里插入图片描述

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


1.静态Web服务器是什么?

在这里插入图片描述

2.如何搭建Python自带的静态Web服务器

在这里插入图片描述

3.访问搭建的静态Web服务器

在这里插入图片描述

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

在这里插入图片描述

5.小结

在这里插入图片描述

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


1.开发自己的静态Web服务器

在这里插入图片描述

2.静态Web服务器-返回固定页面数据的示例代码

import socket

if name == ‘main’:

创建tcp服务端套接字

tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

设置端口号复用, 程序退出端口立即释放

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

绑定端口号

tcp_server_socket.bind((“”, 9000))

设置监听

tcp_server_socket.listen(128)

while True:

等待接受客户端的连接请求

new_socket, ip_port = tcp_server_socket.accept()

代码执行到此,说明连接建立成功

recv_client_data = new_socket.recv(4096)

对二进制数据进行解码

recv_client_content = recv_client_data.decode(“utf-8”)

print(recv_client_content)

with open(“static/index.html”, “rb”) as file:

读取文件数据

file_data = file.read()

响应行

response_line = “HTTP/1.1 200 OK\r\n”

响应头

response_header = “Server: PWS1.0\r\n”

响应体

response_body = file_data

拼接响应报文

response_data = (response_line + response_header + “\r\n”).encode(“utf-8”) + response_body

发送数据

new_socket.send(response_data)

关闭服务与客户端的套接字

new_socket.close()

3.小结

在这里插入图片描述

八、静态Web服务器-返回指定页面数据


1.静态Web服务器的问题

在这里插入图片描述

2.静态Web服务器-返回指定页面数据的示例代码

import socket

def main():

创建tcp服务端套接字

tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

设置端口号复用, 程序退出端口立即释放

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

绑定端口号

tcp_server_socket.bind((“”, 9000))

设置监听

tcp_server_socket.listen(128)

while True:

等待接受客户端的连接请求

new_socket, ip_port = tcp_server_socket.accept()

代码执行到此,说明连接建立成功

recv_client_data = new_socket.recv(4096)

if len(recv_client_data) == 0:

print(“关闭浏览器了”)

new_socket.close()

return

对二进制数据进行解码

recv_client_content = recv_client_data.decode(“utf-8”)

print(recv_client_content)

根据指定字符串进行分割, 最大分割次数指定2

request_list = recv_client_content.split(" ", maxsplit=2)

获取请求资源路径

request_path = request_list[1]

print(request_path)

判断请求的是否是根目录,如果条件成立,指定首页数据返回

if request_path == “/”:

request_path = “/index.html”

try:

动态打开指定文件

with open(“static” + request_path, “rb”) as file:

读取文件数据

file_data = file.read()

except Exception as e:

请求资源不存在,返回404数据

响应行

response_line = “HTTP/1.1 404 Not Found\r\n”

响应头

response_header = “Server: PWS1.0\r\n”

with open(“static/error.html”, “rb”) as file:

file_data = file.read()

响应体

response_body = file_data

拼接响应报文

response_data = (response_line + response_header + “\r\n”).encode(“utf-8”) + response_body

发送数据

new_socket.send(response_data)

else:

响应行

response_line = “HTTP/1.1 200 OK\r\n”

响应头

response_header = “Server: PWS1.0\r\n”

响应体

response_body = file_data

拼接响应报文

response_data = (response_line + response_header + “\r\n”).encode(“utf-8”) + response_body

发送数据

new_socket.send(response_data)

finally:

关闭服务与客户端的套接字

new_socket.close()

if name == ‘main’:

main()

3.小结

在这里插入图片描述

九、静态Web服务器-多任务版


1.静态Web服务器的问题

在这里插入图片描述

2.静态Web服务器-多任务版的示例代码

import socket

import threading

处理客户端的请求

def handle_client_request(new_socket):

代码执行到此,说明连接建立成功

recv_client_data = new_socket.recv(4096)

if len(recv_client_data) == 0:

print(“关闭浏览器了”)

new_socket.close()

return

对二进制数据进行解码

recv_client_content = recv_client_data.decode(“utf-8”)

print(recv_client_content)

根据指定字符串进行分割, 最大分割次数指定2

request_list = recv_client_content.split(" ", maxsplit=2)

获取请求资源路径

request_path = request_list[1]

print(request_path)

判断请求的是否是根目录,如果条件成立,指定首页数据返回

if request_path == “/”:

request_path = “/index.html”

try:

动态打开指定文件

with open(“static” + request_path, “rb”) as file:

读取文件数据

file_data = file.read()

except Exception as e:

请求资源不存在,返回404数据

响应行

response_line = “HTTP/1.1 404 Not Found\r\n”

响应头

response_header = “Server: PWS1.0\r\n”

with open(“static/error.html”, “rb”) as file:

file_data = file.read()

响应体

response_body = file_data

拼接响应报文

response_data = (response_line + response_header + “\r\n”).encode(“utf-8”) + response_body

发送数据

new_socket.send(response_data)

else:

响应行

response_line = “HTTP/1.1 200 OK\r\n”

响应头

response_header = “Server: PWS1.0\r\n”

响应体

response_body = file_data

拼接响应报文

response_data = (response_line + response_header + “\r\n”).encode(“utf-8”) + response_body

发送数据

new_socket.send(response_data)

finally:

关闭服务与客户端的套接字

new_socket.close()

程序入口函数

def main():

创建tcp服务端套接字

tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

设置端口号复用, 程序退出端口立即释放

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

绑定端口号

tcp_server_socket.bind((“”, 9000))

设置监听

tcp_server_socket.listen(128)

while True:

等待接受客户端的连接请求

new_socket, ip_port = tcp_server_socket.accept()

print(ip_port)

当客户端和服务器建立连接程,创建子线程

sub_thread = threading.Thread(target=handle_client_request, args=(new_socket,))

设置守护主线程

sub_thread.setDaemon(True)

启动子线程执行对应的任务

sub_thread.start()

if name == ‘main’:

main()

3.小结

在这里插入图片描述

十、静态Web服务器-面向对象开发


1.以面向对象的方式开发静态Web服务器

在这里插入图片描述

2.静态Web服务器-面向对象开发的示例代码

import socket

import threading

定义web服务器类

class HttpWebServer(object):

def init(self):

创建tcp服务端套接字

tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

设置端口号复用, 程序退出端口立即释放

tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)

绑定端口号

tcp_server_socket.bind((“”, 9000))

设置监听

tcp_server_socket.listen(128)

保存创建成功的服务器套接字

self.tcp_server_socket = tcp_server_socket

处理客户端的请求

@staticmethod

def handle_client_request(new_socket):

代码执行到此,说明连接建立成功

recv_client_data = new_socket.recv(4096)

if len(recv_client_data) == 0:

print(“关闭浏览器了”)

new_socket.close()

return

对二进制数据进行解码

recv_client_content = recv_client_data.decode(“utf-8”)

print(recv_client_content)

根据指定字符串进行分割, 最大分割次数指定2

request_list = recv_client_content.split(" ", maxsplit=2)

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值