Python网络编程—TCP套接字之HTTP传输
HTTP协议 (超文本传输协议)
1.用途 : 网页获取,数据的传输
2.特点:
- 应用层协议,传输层使用tcp传输
- 简单,灵活,很多语言都有HTTP专门接口
- 无状态,协议不记录传输内容
- http1.1 支持持久连接,丰富了请求类型
3.网页请求过程
- 客户端(浏览器)通过tcp传输,发送http请求给服务端
- 服务端接收到http请求后进行解析
- 服务端处理请求内容,组织响应内容
- 服务端将响应内容以http响应格式发送给浏览器
- 浏览器接收到响应内容,解析展示
HTTP请求(request)
1.请求行 : 具体的请求类别和请求内容
GET / HTTP/1.1
请求类别 请求内容 协议版本
请求类别:每个请求类别表示要做不同的事情
GET : 获取网络资源
POST :提交一定的信息,得到反馈
HEAD : 只获取网络资源的响应头
PUT : 更新服务器资源
DELETE : 删除服务器资源
CONNECT
TRACE : 测试
OPTIONS : 获取服务器性能信息
2.请求头:对请求的进一步解释和描述
Accept-Encoding: gzip
3.空行
4.请求体: 请求参数或者提交内容
1 from socket import * 2 3 s = socket() 4 s.bind(('0.0.0.0',8001)) 5 s.listen(3) 6 c,addr = s.accept() 7 print("Connect from",addr) 8 data = c.recv(4096) 9 print(data) 10 11 data = """HTTP/1.1 200 OK 12 Content-Type:text/html 13 14 <h1>Hello world</h1> 15 """ 16 c.send(data.encode()) 17 18 c.close() 19 s.close()
http响应(response)
响应格式:响应行,响应头,空行,响应体
响应行 : 反馈基本的响应情况
HTTP/1.1 200 OK
版本信息 响应码 附加信息
响应码 :
1xx 提示信息,表示请求被接收
2xx 响应成功
3xx 响应需要进一步操作,重定向
4xx 客户端错误
5xx 服务器错误
响应头:对响应内容的描述
Content-Type: text/html
响应体:响应的主体内容信息
1 from socket import * 2 3 # 处理客户端请求 4 def handle(connfd): 5 request = connfd.recv(4096) # 接收请求 6 # 防止客户端断开request为空 7 if not request: 8 return 9 request_line = request.splitlines()[0] 10 info = request_line.decode().split(' ')[1] 11 if info == '/': 12 with open('index.html') as f: 13 response = "HTTP/1.1 200 OK\r\n" 14 response += "Content-Type:text/html\r\n" 15 response += '\r\n' 16 response += f.read() 17 else: 18 response = "HTTP/1.1 404 Not Found\r\n" 19 response += "Content-Type:text/html\r\n" 20 response += '\r\n' 21 response += "<h1>Sorry...</h1>" 22 # 发送给浏览器 23 connfd.send(response.encode()) 24 25 26 # 搭建tcp网络 27 sockfd = socket() 28 sockfd.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) 29 sockfd.bind(('0.0.0.0',8000)) 30 sockfd.listen(3) 31 while True: 32 connfd,addr = sockfd.accept() 33 handle(connfd) # 处理客户端请求