Python Socket实现HTTP客户端及服务端

HTTP(Hypertext Transfer Protocol)是一种用于在Web上传输数据的协议。它是一种无状态的、应用层的协议,用于客户端和服务器之间的通信。HTTP协议基于请求-响应模型,客户端发送请求给服务器,服务器返回响应。本文主要介绍通过Python中的socket实现HTTP协议通信的客户端和服务端,以及相关的示例代码。

1、HTTP协议详解

参考文档:HTTP协议详解及使用

2、Python实现HTTP协议客户端

客户端(例如Web浏览器)向服务器发送HTTP请求。请求由请求行、请求头部和请求体组成。请求行包含请求方法(GET、POST等)、请求的URL和HTTP协议版本。

import socket

def send_http_request(host, port, request):
    # 创建Socket连接
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_socket.connect((host, port))

    # 发送HTTP请求
    client_socket.sendall(request.encode())

    # 接收HTTP响应
    response = b""
    while True:
        data = client_socket.recv(1024)
        if not data:
            break
        response += data

    # 关闭Socket连接
    client_socket.close()

    return response.decode()

# 定义HTTP请求报文
http_request = """GET / HTTP/1.1
Host: www.example.com
Connection: close

"""

# 发送HTTP请求并接收响应
response = send_http_request("www.example.com", 80, http_request)
print(response)

3、Python实现HTTP协议服务端

服务器接收处理请求,并将请求处理结果返回客户端。

import socket

def handle_http_request(request):
    # 处理HTTP请求
    response = "HTTP/1.1 200 OK\r\n"
    response += "Content-Type: text/plain\r\n"
    response += "\r\n"
    response += "Hello, World!"

    return response

# 创建Socket连接
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(1)

print("HTTP server is running at http://localhost:8080")

while True:
    # 接受客户端连接
    client_socket, client_address = server_socket.accept()

    # 接收HTTP请求
    request = client_socket.recv(1024).decode()

    # 处理HTTP请求并生成响应
    response = handle_http_request(request)

    # 发送HTTP响应
    client_socket.sendall(response.encode())

    # 关闭客户端连接
    client_socket.close()

推荐阅读
cjavapy编程之路首页