PythonHTTP协议

2017-12-20  本文已影响0人  等哈光圈

网络通信过程:

HTTP协议:

浏览器请求和服务器相应

GET表示一个读取请求
失败的相应有404 Not Found:网页不存在
500 Internal Server Error:服务器内部出错
Content-Type提示相应的内容

HTTP请求步骤

步骤1:浏览器首先向服务器发送HTTP请求,请求包括:
    方法:GET还是POST,GET仅请求资源,POST会附带用户数据;
    路径:/full/url/path;
    域名:由Host头指定:Host:www.sina.com 以及其他相关的Header;
步骤2:服务器向浏览器返回HTTP相应,相应包括:
    相应代码:200表示成功(OK),3xx表示重定向,4xx表示客户端发送的请求有错误(比如404 Not Found), 5xx表示服务器端处理时发生了错误(比如 503 Service Unavailable);
    响应类型:由Content-Type指定,以及其他相关的Header;
步骤3:如果浏览器还需要继续向服务器请求其他资源,比如图片,就再次发出HTTP请求,重复1、2

HTTP格式

HTTP GET请求的格式:

GET /path HTTP/1.1
Header1:Value1
Header2:Value2
Header3:Value3

每个Hearer一行一个,换行符是\r\n

HTTP POST请求的格式:

POST /path HTTP/1.1
Header1:Value1
Header2:Value2
Header3:Value3

body data goes here...


每一行换行符是\r\n
当遇到连续两个\r\n时,Header部分结束,后面的数据全部是Body

HTTP响应的格式:

200 OK HTTP/1.1
Header1: Value1
Header2: Value2
Header3: value3

body data goes here...

没一行换行符是\r\n
HTTP响应如果包含body,也是通过\r\n\r\n来分隔的



请注意:Bodyde 数据类型由Content-Type头来确定;当存在Content-Encoding时,Body数据是被压缩的(压缩的目的在于减少Body的大小,加快网络传输)

请求报文格式

请求行[方法 路径 版本\r\n]
请求头[头名称:头值\r\n]
空行[\r\n]
请求体

响应报文格式

响应行[版本 响应状态]
响应头[头名称:头值]
空行
响应体

长连接和短连接:

TCP短链接(模拟一种情况)

TCP长连接(模拟一种情况)

TCP长/短连接操作过程

# 短连接的操作步骤:
建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接
# 长连接的操作步骤:
建立连接——数据传输...(保持连接)...数据传输——关闭连接

TCP长/短连接的优点个缺点

TCP长/短连接的应用场景

小案例(模拟浏览器)


import socket

# 创建TCP连接
tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# DNS解析 和  连接HTTP服务器
tcp_socket.connect(("www.itcastcpp.cn", 80))

# 组包 发送HTTP请求报文

# 请求行
request_line = "GET / HTTP/1.1\r\n"

# 请求头
request_header = "Host: www.itcastcpp.cn\r\n"
request_data = request_line + request_header + "\r\n"

# 发送请求
tcp_socket.send(request_data.encode())


# 接收响应报文
response_data = tcp_socket.recv(4096)

# 对响应报文进行解析 -- 切割
response_str_data = response_data.decode()
# print(response_data)

# '\r\n\r\n'之后的数据就是响应体数据
index = response_str_data.find("\r\n\r\n")

# 切割出的数据就是文件数据
html_data = response_str_data[index+4:]

# data_file = open("index.html", "wb")
# data_file.write(html_data.encode())
# data_file.close()
with open("index.html", "wb") as file:
    file.write(html_data.encode())

# 关闭套接字
tcp_socket.close()
上一篇下一篇

猜你喜欢

热点阅读