Python网络编程:从Socket到HTTP的完整指南
1. Python网络编程基础概述网络编程是现代软件开发中不可或缺的核心技能之一。Python凭借其简洁的语法和丰富的标准库成为学习网络编程的理想选择。Socket作为网络通信的基础提供了操作系统级别的网络接口而HTTP则是构建在TCP/IP协议之上的应用层协议构成了现代Web通信的基石。在实际项目中我经常遇到需要处理网络通信的场景。比如最近开发的一个分布式爬虫系统就需要在多个节点间建立可靠的Socket连接同时还要处理HTTP请求获取网页数据。掌握从Socket到HTTP的完整知识链能让你在开发网络应用时事半功倍。2. Socket编程核心原理2.1 Socket基础概念Socket本质上是操作系统提供的网络通信接口的抽象。在Python中我们通过socket模块来使用这些接口。创建Socket时需要指定两个关键参数地址族(AF_INET用于IPv4AF_INET6用于IPv6)套接字类型(SOCK_STREAM用于TCPSOCK_DGRAM用于UDP)import socket # 创建TCP Socket tcp_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建UDP Socket udp_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM)2.2 TCP Socket通信流程TCP通信采用可靠的连接导向方式典型流程如下服务端创建Socket绑定地址和端口(bind)开始监听(listen)接受连接(accept)收发数据(send/recv)关闭连接(close)客户端创建Socket连接服务器(connect)收发数据(send/recv)关闭连接(close)下面是一个完整的TCP通信示例# TCP服务端 import socket server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((0.0.0.0, 8080)) server_socket.listen(5) while True: client_socket, addr server_socket.accept() print(fConnection from {addr}) data client_socket.recv(1024) print(fReceived: {data.decode()}) client_socket.send(bHello from server) client_socket.close()# TCP客户端 import socket client_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect((127.0.0.1, 8080)) client_socket.send(bHello from client) response client_socket.recv(1024) print(fServer response: {response.decode()}) client_socket.close()2.3 UDP Socket通信特点UDP是无连接的协议通信流程更简单服务端创建Socket绑定地址和端口接收数据(recvfrom)发送数据(sendto)客户端创建Socket发送数据(sendto)接收数据(recvfrom)UDP示例代码# UDP服务端 import socket server_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind((0.0.0.0, 8080)) while True: data, addr server_socket.recvfrom(1024) print(fReceived from {addr}: {data.decode()}) server_socket.sendto(bHello from UDP server, addr)# UDP客户端 import socket client_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) client_socket.sendto(bHello from UDP client, (127.0.0.1, 8080)) response, addr client_socket.recvfrom(1024) print(fServer response: {response.decode()})3. Socket高级应用3.1 非阻塞Socket默认情况下Socket操作是阻塞的可以通过setblocking(False)设置为非阻塞模式import socket s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setblocking(False) # 设置为非阻塞模式 try: s.connect((example.com, 80)) except BlockingIOError: # 连接正在进行中 pass3.2 Socket超时设置可以通过settimeout()方法设置Socket操作的超时时间s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.settimeout(5.0) # 设置5秒超时 try: s.connect((example.com, 80)) except socket.timeout: print(Connection timed out)3.3 多客户端处理使用select模块可以处理多个客户端连接import select import socket server socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind((0.0.0.0, 8080)) server.listen(5) inputs [server] outputs [] while inputs: readable, writable, exceptional select.select(inputs, outputs, inputs) for s in readable: if s is server: client, addr s.accept() inputs.append(client) else: data s.recv(1024) if data: s.send(data) else: inputs.remove(s) s.close()4. HTTP协议实现4.1 HTTP基础HTTP是基于TCP的应用层协议一个简单的HTTP请求/响应过程如下客户端建立TCP连接到服务器80端口客户端发送HTTP请求服务器处理请求并返回响应关闭连接(HTTP/1.0)或保持连接(HTTP/1.1)4.2 实现简单HTTP服务器下面是一个简单的HTTP服务器实现import socket def handle_request(client_socket): request client_socket.recv(1024) print(request.decode()) response HTTP/1.1 200 OK Content-Type: text/html html body h1Hello from Python HTTP Server!/h1 /body /html client_socket.send(response.encode()) client_socket.close() def main(): server_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind((0.0.0.0, 8080)) server_socket.listen(5) while True: client_socket, addr server_socket.accept() handle_request(client_socket) if __name__ __main__: main()4.3 发送HTTP请求使用Socket发送HTTP GET请求import socket def http_get(host, path): s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((host, 80)) request fGET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n s.send(request.encode()) response b while True: data s.recv(1024) if not data: break response data s.close() return response.decode() print(http_get(example.com, /))5. 实战经验与常见问题5.1 端口占用问题常见错误Address already in use。解决方案import socket s socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 设置地址重用 s.bind((0.0.0.0, 8080))5.2 粘包问题TCP是流式协议可能会发生粘包现象。解决方案固定长度消息特殊分隔符消息头消息体# 使用消息头消息体方式 import struct def send_msg(sock, msg): # 前4字节为消息长度 msg struct.pack(I, len(msg)) msg sock.sendall(msg) def recv_msg(sock): # 先读取4字节消息长度 raw_msglen recvall(sock, 4) if not raw_msglen: return None msglen struct.unpack(I, raw_msglen)[0] return recvall(sock, msglen) def recvall(sock, n): data bytearray() while len(data) n: packet sock.recv(n - len(data)) if not packet: return None data.extend(packet) return data5.3 编码问题网络传输中要特别注意编码问题# 发送时编码 data 你好.encode(utf-8) s.send(data) # 接收时解码 received s.recv(1024).decode(utf-8)5.4 性能优化建议使用连接池管理TCP连接合理设置缓冲区大小考虑使用异步IO(asyncio)对于高并发场景考虑使用更高级的框架# 使用asyncio实现高性能服务器 import asyncio async def handle_echo(reader, writer): data await reader.read(100) message data.decode() addr writer.get_extra_info(peername) print(fReceived {message} from {addr}) writer.write(data) await writer.drain() writer.close() async def main(): server await asyncio.start_server( handle_echo, 127.0.0.1, 8888) async with server: await server.serve_forever() asyncio.run(main())6. 从Socket到HTTP的完整案例下面是一个完整的HTTP代理服务器实现演示了如何结合Socket和HTTP知识import socket import threading def handle_client(client_socket): request client_socket.recv(4096) # 解析HTTP请求 first_line request.split(b\n)[0] method, url, version first_line.split() # 提取目标主机和端口 host url.split(b/)[2] port 80 # 连接到目标服务器 remote_socket socket.socket(socket.AF_INET, socket.SOCK_STREAM) remote_socket.connect((host, port)) remote_socket.send(request) # 转发响应 while True: data remote_socket.recv(4096) if not data: break client_socket.send(data) client_socket.close() remote_socket.close() def main(): proxy socket.socket(socket.AF_INET, socket.SOCK_STREAM) proxy.bind((0.0.0.0, 8080)) proxy.listen(5) while True: client_socket, addr proxy.accept() print(fAccepted connection from {addr}) client_thread threading.Thread( targethandle_client, args(client_socket,) ) client_thread.start() if __name__ __main__: main()这个代理服务器可以处理HTTP请求将请求转发到目标服务器并将响应返回给客户端。通过这个案例你可以看到Socket和HTTP如何协同工作。

相关新闻

3步掌握Mermaid Live Editor:高效创建专业图表的实用指南

3步掌握Mermaid Live Editor:高效创建专业图表的实用指南

3步掌握Mermaid Live Editor:高效创建专业图表的实用指南 【免费下载链接】mermaid-live-editor Edit, preview and share mermaid charts/diagrams. New implementation of the live editor. 项目地址: https://gitcode.com/GitHub_Trending/me/mermaid-live-edi…

2026/9/23 17:07:17 阅读更多 →
如何让老旧Mac焕发新生?OpenCore Legacy Patcher完整指南

如何让老旧Mac焕发新生?OpenCore Legacy Patcher完整指南

如何让老旧Mac焕发新生?OpenCore Legacy Patcher完整指南 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 你是否有一台被苹果官方抛弃的老旧Mac&a…

2026/9/23 13:24:52 阅读更多 →
多因子检测试剂盒:从“不知所措”到“得心应手”—— 常见问题解答

多因子检测试剂盒:从“不知所措”到“得心应手”—— 常见问题解答

多因子检测技术因其“一次实验,多重数据”的高效性,正迅速成为生命科学研究的热门工具。然而,许多研究者,尤其是首次接触的用户,在试剂盒选择、实验操作和数据分析等环节常常面临诸多困惑。 基于我们与大量用户的深入…

2026/9/23 12:40:34 阅读更多 →

最新新闻

深度学习新闻分类推荐系统:从TextCNN到个性化推荐

深度学习新闻分类推荐系统:从TextCNN到个性化推荐

简介:这份基于深度学习的新闻分类推荐系统Python实现源码,是专为课程设计与期末大作业准备的高分项目,下载后无需修改即可运行,适用于需要快速交付完整课题的高校学生。系统涵盖新闻数据预处理、文本分类模型训练、推荐逻辑展示等…

2026/9/25 0:00:41 阅读更多 →
汽车电子底层软件开发:AUTOSAR与CAN总线实战解析

汽车电子底层软件开发:AUTOSAR与CAN总线实战解析

1. 这门“汽车电子底层软件开发就业课”到底在教什么?——不是写个LED闪烁就能上岗的很多人看到“汽车电子底层软件开发就业课”这个标题,第一反应是:不就是嵌入式C语言单片机CAN通信?刷几道LeetCode、调通一个STM32 CAN收发例程&…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
CVE-2025-27591深度解析:日志组件本地权限提升漏洞与防御

CVE-2025-27591深度解析:日志组件本地权限提升漏洞与防御

CVE-2025-27591 最近在安全圈里讨论度不低,核心是 Below 这个日志处理组件在权限控制上出了问题,低权限用户有机会利用日志文件、临时目录的处理流程,把自身权限抬升到管理员甚至系统级别。很多人一听到“利用脚本”就先想到怎么打&#xff0…

2026/9/24 23:59:40 阅读更多 →

日新闻

AI元人文:从工具使用到思维重构的深度探索

AI元人文:从工具使用到思维重构的深度探索

最近半年我一直在琢磨一件事:AI元人文到底是什么?说白了,就是“用元视角重新审视人与AI的关系”,也在“探索AI如何反向逼着我们发现自己的思考边界”。标题里的“元探索”,在我看就是一层套一层的追问——当你用AI解决…

2026/9/25 0:00:41 阅读更多 →
Python+CNN车牌识别实战:从数据预处理到模型训练与部署

Python+CNN车牌识别实战:从数据预处理到模型训练与部署

简介:基于Python与卷积神经网络的车牌识别项目,面向计算机视觉初学者及智能交通开发者,目标是帮助用户掌握从数据预处理、模型构建到实际部署的完整流程。压缩包共25个文件,包含jpg/png图像样本、py训练脚本、md说明文档、dat数据…

2026/9/25 0:00:41 阅读更多 →
Vim基础操作全攻略:保存退出、模式切换与高频命令实战

Vim基础操作全攻略:保存退出、模式切换与高频命令实战

1. 项目概述1.1 核心需求解析今天聊聊Vim。写这个题目的原因是:几乎每个后端开发者、运维人员、数据工程师某天都会遇到一个场景——深夜加班,服务器登录界面只有黑底白字,编辑器只有vi/vim,你必须在五分钟内完成一次配置修改并保…

2026/9/25 0:00:41 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →