一、HTTP协议

HTTP 协议主要用于网页获取和数据传输。HTTP 依赖于 TCP 进行数据传输。

在 HTTP 通信过程中,客户端(浏览器)通过 TCP 传输发送 HTTP 请求给服务端。服务端接收到请求后进行解析,并处理请求内容,组织响应内容。接着,服务端将响应内容以 HTTP 响应格式发送回浏览器。浏览器接收到响应内容后,会进行解析并展示给用户。

二、HTTP请求

请求行:包含请求方法、请求内容和HTTP版本

示例:GET /index.html HTTP/1.1

请求头部:包含请求的附加信息,每一行都是一个键值对。

示例:User-Agent: Mozilla/5.0
           Accept: text/html

  • User-Agent:包含发出请求的浏览器或客户端软件的信息。

  • Accept:指定客户端能够处理的内容类型。它告诉服务器返回的资源类型。

  • Authorization:用于客户端身份验证,通常在需要认证的请求中使用。

  • Cookie:发送与请求相关的cookie信息。

  • Referer:指定当前请求的来源页面URL,通常用于追踪和分析页面跳转来源。

空行:在请求头部之后,用于分隔请求头部和请求体。

请求体:要发送的数据。

三、HTTP响应

状态行:包括HTTP版本、状态码和状态描述。

示例:HTTP/1.1 200 OK

  • 状态码:请求的处理结果    eg: 200 表示成功,404 表示未找到,500 表示服务器错误等。

  • 状态描述:对状态码的简短描述。

响应头部:包含服务器和响应的附加信息,每一行是一个键值对。

示例:Content-Type: text/html

           Content-Length: 1234

  • Content-Type:指定响应体的媒体类型。它告诉客户端如何解释响应体的内容。

  • Content-Length:指定响应体的大小,以字节为单位。

  • Location:当响应状态码为重定向(如301、302)时,指示客户端应该请求的新的URL地址。

  • Set-Cookie:服务器设置的Cookie,客户端在后续请求中会带上这个Cookie。

           

空行:响应头部后是一个空行。

响应体:实际要传输的数据 ,可以是HTML、图片、文件等各种格式。

import socket

ADDR = ("127.0.0.1", 8022)

server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

server.bind(ADDR)

server.listen(5)

# 等待浏览器连接
conn, addr = server.accept()
print("连接", addr)

request = conn.recv(1024)
print(request.decode("utf-8"))

# 组织响应
response = """HTTP/1.1 200 OK
Content-Type:text/html

hello K_K
"""
conn.send(response.encode("gbk"))

conn.close()
server.close()

图示效果:

升级一下:检索具体

import socket

ADDR = ('127.0.0.1', 8022)
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server.bind(ADDR)
server.listen(5)
while True:
    conn, addr = server.accept()
    print("连接", addr)
    request = conn.recv(1024)
    print(request.decode('utf-8'))
    response = "HTTP/1.1 200 ok\r\n"
    response += "content-type: text/html\r\n"
    response += "\r\n"
    # GET /lw HTTP/1.1
    info_list = request.decode("utf-8").split('\r\n')[0]
    info = info_list.split(' ')[1]
    if info == "/K_K":
        response += "你好 K_K"
    elif info == "/Kl":
        response += "来了"
    elif info == "/":
        response += "请问你是?"
    else:
        response += "不在"

    conn.send(response.encode('gbk'))  
    conn.close()
server.close()

效果展示:

用函数升级思维 插入图片 用with阅读形式打开

import socket

ADDR = ('127.0.0.1', 8022)


def main():
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    server.bind(ADDR)
    server.listen(5)
    while True:
        conn, addr = server.accept()
        print("连接", addr)
        handle(conn)
        conn.close()


def handle(conn):
    request = conn.recv(1024)
    if not request:
        return
    print(request.decode('utf-8'))
    response = "HTTP/1.1 200 ok\r\n"
    response += "content-type: image/jpeg\r\n"
    response += "\r\n"
    with open(r'D:\py_project\pythonProject10\Study0912\4379.jpg_wh300.jpg', "rb") as file:
        response = response.encode('utf-8') + file.read()
    conn.send(response)

    # GET /lw HTTP/1.1

    conn.send(response.encode('gbk')) 
    conn.close()


if __name__ == '__main__':
    main()

效果展示

注意:

1.浏览器是gbk模式

2.改变content-type可以传入任意形式

更多推荐