Python网络编程—TCP套接字之HTTP传输

HTTP协议 (超文本传输协议)

1.用途 : 网页获取,数据的传输

2.特点:

  • 应用层协议,传输层使用tcp传输
  • 简单,灵活,很多语言都有HTTP专门接口
  • 无状态,协议不记录传输内容
  • http1.1 支持持久连接,丰富了请求类型

3.网页请求过程

  1. 客户端(浏览器)通过tcp传输,发送http请求给服务端
  2. 服务端接收到http请求后进行解析
  3. 服务端处理请求内容,组织响应内容
  4. 服务端将响应内容以http响应格式发送给浏览器
  5. 浏览器接收到响应内容,解析展示

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 请求响应示例

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)  # 处理客户端请求
http 发送网页给浏览器

 

posted @ 2019-06-07 19:52  maplethefox  阅读(1621)  评论(0编辑  收藏  举报