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

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

%s" % data, "utf-8"))  # 发送的是字节数据
        # conn.send(b"HTTP/1.1 201 OK

%s" % data.encode("utf-8"))
        # conn.sendall(b"HTTP/1.1 201 OK

%s" % data.encode("utf-8"))
        # conn.sendall(bytes("%s" % data, "utf-8"))
        conn.close()


if __name__ == '__main__':
    main()

原文地址:https://www.cnblogs.com/Python666/p/6856744.html