HTTP原理
cs模式
bs模式browser --- server
Http协议
超文本传输协议
是无状态的,每一次的请求是和上一次的没有关系
http协议包括两部分:
请求协议:客户端(浏览器)发给服务端
响应协议: 服务端发送给客户端(浏览器)
URL:统一资源定位符,就是一个网址协议名://域名:端口/路径
请求协议
-
1 请求首行 GET /favionico HTTP1.1(HTTP协议的版本)
-
2 请求头信息
referer:信息中包含数据的真实地址 容易盗链
Cookie:(里面是键值对)
因为http是无状态的协议,所以通过cookie保存信息,下一次登录的时候发送给服务端 -
3 空行
-
4 请求体(请求数据 post数据)--getget放在url地址后面)不存在 ,默认的是post
GET请求
HTTP的默认请求是GET
- 没有请求体
- 数据大小限制 1K
- GET会暴露在地址栏中
GET 操作
- URL
- 点击超链接
- 表单默认,但是通常修改成POST
POST请求
- 请求中存在中文,会使用URL编码
响应协议
响应首行(解析HTTP协议的版本)
响应头信息
空行
响应体
200:请求成功,浏览器会把响应体内容(通常是html)显示在浏览器中;
404:请求的资源没有找到,说明客户端错误的请求了不存在的资源;
500:请求资源找到了,但服务器内部出现了错误;
302:重定向,当响应码为302时,表示服务器要求浏览器重新再发一个请求,服务器会发送一个响应头Location,它指定了新请求的URL地址;
304:重定向
Last-Modified 是index.html的最后修改时间
HTML
HTTP/1.1 201 OK\r\n\r\n
import socket
def main():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('localhost', 8081))
sock.listen(5)
while True:
print("server is working.....")
conn, address = sock.accept()
request = conn.recv(1024)
with open("index.html", encoding="utf-8") as f:
data = f.read() # data 读取的是str数据
conn.sendall(bytes("HTTP/1.1 201 OK\r\n\r\n%s" % data, "utf-8")) # 发送的是字节数据
# conn.send(b"HTTP/1.1 201 OK\r\n\r\n%s" % data.encode("utf-8"))
# conn.sendall(b"HTTP/1.1 201 OK\r\n\r\n%s" % data.encode("utf-8"))
# conn.sendall(bytes("%s" % data, "utf-8"))
conn.close()
if __name__ == '__main__':
main()