Python高级应用系列(十八)网络编程:socket、http协议与Web框架原理
前言网络编程是 Python 后端开发的基石。无论你是构建 HTTP API、开发实时通信系统,还是调试网络协议,理解 socket 层的工作原理都至关重要。很多开发者每天使用 requests、Flask、Django,却从未真正理解 HTTP 的底层机制和 Web 框架的请求处理流程。本文从 socket 起步,逐步深入到 HTTP 协议原理、urllib/requests 的使用,再到 Web 框架的请求处理机制,最后动手实现一个迷你 WSGI 服务器。通过这条完整的技术链路,你将获得对网络编程的深度理解。目录一、socket 基础:TCP 与 UDP二、socket 服务器与客户端实战三、HTTP 协议深度解析四、urllib 与 requests:HTTP 客户端五、Web 框架原理:从 WSGI 到请求处理六、实现一个迷你 WSGI 服务器七、网络编程安全注意事项八、总结一、socket 基础:TCP 与 UDP1.1 什么是 socketsocket(套接字)是操作系统提供的网络通信抽象,是 TCP/IP 协议栈的 API 入口。Python 标准库socket模块封装了这些系统调用,提供跨平台的网络编程能力。TCP/IP 四层模型与 socket 的对应关系: 应用层 HTTP / SMTP / FTP 传输层 TCP (socket.SOCK_STREAM) | UDP (socket.SOCK_DGRAM) 网络层 IP 链路层 Ethernet1.2 TCP vs UDP:核心区别特性TCP (SOCK_STREAM)UDP (SOCK_DGRAM)连接性面向连接(三次握手)无连接可靠性可靠交付、顺序保证不保证、不排序消息边界流式(无边界)数据报(有边界)速度较慢(建立连接开销)快(无连接开销)适用场景文件传输、HTTP、邮件DNS、实时音视频、广播import socket # 创建 socket 的标准方式 # AF_INET: IPv4 地址族 # SOCK_STREAM: TCP 面向字节流 tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET6: IPv6 地址族 # SOCK_DGRAM: UDP 数据报 udp_sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) # 设置 socket 选项(重用 TIME_WAIT 状态的端口) tcp_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置超时 tcp_sock.settimeout(10.0) print(f"TCP socket: {tcp_sock}") print(f"UDP socket: {udp_sock}")二、socket 服务器与客户端实战2.1 TCP 迭代服务器import socket import threading from pathlib import Path class TCPServer: """简单 TCP 服务器(迭代模式,适合学习)""" def __init__(self, host: str = "0.0.0.0", port: int = 9000): self.host = host self.port = port self.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) self.running = False def start(self): """启动服务器""" self.server_socket.bind((self.host, self.port)) self.server_socket.listen(128) # 半连接队列长度 self.running = True print(f"服务器启动: {self.host}:{self.port}") while self.running: try: # 阻塞等待客户端连接 client_socket, client_addr = self.server_socket.accept() print(f"客户端连接: {client_addr}") # 每个客户端一个线程处理 thread = threading.Thread( target=self._handle_client, args=(client_socket, client_addr), daemon=True ) thread.start() except OSError: break # 服务器关闭时触发 def _handle_client(self, sock: socket.socket, addr: tuple): """处理单个客户端请求""" try: # 设置客户端 socket 超时 sock.settimeout(30.0) # 接收数据(TCP 是流式协议,需自行处理消息边界) # 这里简单假设客户端发来的是一行文本 data = b"" while True: chunk = sock.recv(4096) if not chunk: break # 客户端关闭连接 data += chunk if b"\n" in chunk: break message = data.decode("utf-8").strip() print(f"收到 ({addr}): {message}") # 构造 HTTP 响应 response_body = f"服务器收到消息: {message}\n" response = ( "HTTP/1.1 200 OK\r\n" "Content-Type: text/plain; charset=utf-8\r\n" f"Content-Length: {len(response_body.encode())}\r\n" "Connection: close\r\n"
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2563464.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!