''' http协议:超文本传输协议 ①基于TCP/IP协议基础上的应用层协议,底层实现仍为socket ②基于请求-响应模式:通讯一定是从客户端开始,服务器端接受到客户端一定会做出对应响应 ③无状态:协议不对任何一次通讯状态和任何数据做保存 ③无连接:一次连接只完成一次请求-响应,请求响应完毕后立即断开连接 '''
http工作原理(事务)
# 一次http操作称之为一个事务,工作过程可分为四步 # 1.客户端与服务端建立连接 # 2.客户端发生一个http协议指定格式的请求 # 3.服务器端接收请求后,响应一个http协议指定格式的响应 # 4.客户端将服务器的响应显示展现给用户
请求
''' 请求行:GET|POST(请求方式) /(请求路径) HTTP/1.1(http协议版本) 请求头:(了解) 请求体:GET 请求体放到请求路径后进行拼接 POST会在请求行与请求头结束后,以数据包方式单独发送 请求报文 # 请求行 请求头 请求体 ''' POST / HTTP/1.1 #请求行(必须) Host: 127.0.0.1:8001 Connection: keep-alive Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 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, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8 usr=abc&pwd=123 #请求体(可选) '''
响应
''' 响应行(必须):HTTP/1.1(http协议版本) 200(状态码) ok(状态结束) 1打头:消息通知 2打头:请求成功 3打头:重定向(重新定向) 4打头:客户端错误 5打头:服务器端错误 响应头(可选):(了解) 响应体(可选):具体数据 注意:响应规则与响应体内容之间还需要一个 标识分割 响应规则:响应行和响应头 响应报文: # 响应行 响应头 响应体 ''' HTTP/1.1 200 OK #响应行 Content-type:text/html #响应头 Login Success #响应体 ''' '''
import socket PORT = 4396 server = socket.socket() server.bind(('127.0.0.1',PORT)) server.listen(5) print('服务端启动:http://127.0.0.1:%s'% PORT) while True: browser,_ = server.accept() data = browser.recv(1024).decode('utf-8') print(data) #一次请求就会获得一次响应,连接不上会一直请求,所以会产生多个响应,超时结束
#server import socket PORT = 4396 server = socket.socket() server.bind(('127.0.0.1',PORT)) server.listen(5) print('服务端启动:http://127.0.0.1:%s'% PORT) while True: browser,_ = server.accept() data = browser.recv(1024).decode('utf-8') print(data) # 要遵循http协议返回数据:响应行(必须) 响应头 响应体 browser.send(b'HTTP/1.1 200 OK ') # 响应行(必须),以 结束 browser.send(b'Content-type:text/html ') # 响应头(可选),服务于响应体 browser.send(b' ') # 响应规则与响应体内容之间还需要一个 标识分割 browser.send(b'normal msg') # 响应体(可选) browser.send(b'<h1>hello wold</h1>') # 响应体(可选) browser.close()