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/10/18 3:16:37 阅读更多 →
如何让老旧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/10/17 13:18:53 阅读更多 →
多因子检测试剂盒:从“不知所措”到“得心应手”—— 常见问题解答

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

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

2026/10/20 21:15:31 阅读更多 →

最新新闻

戴森球计划蓝图新手指南:靠FactoryBluePrints仓库,30分钟搭出不停摆的工厂

戴森球计划蓝图新手指南:靠FactoryBluePrints仓库,30分钟搭出不停摆的工厂

戴森球计划蓝图新手指南:靠FactoryBluePrints仓库,30分钟搭出不停摆的工厂 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 你导入游戏的第一张蓝图&…

2026/10/21 3:30:24 阅读更多 →
Rish Shell终极指南:如何在任何终端中获取Shizuku权限

Rish Shell终极指南:如何在任何终端中获取Shizuku权限

Rish Shell终极指南:如何在任何终端中获取Shizuku权限 Rish Shell是一个强大的Android可执行文件,让你能够在任何终端应用中获取Shizuku权限,实现权限提升的系统操作。无论你使用的是Termux还是其他终端模拟器,Rish Shell都能为你…

2026/10/21 3:30:24 阅读更多 →
ResNet适配CIFAR10:从零实现轻量级结构改造与训练优化

ResNet适配CIFAR10:从零实现轻量级结构改造与训练优化

简介:本资源是一份面向深度学习初学者与实践者的ResNet图像分类教学实现包,聚焦CIFAR-10小样本图像识别任务,帮助读者理解残差网络核心原理并完成端到端训练部署。压缩包共5个文件,含4个Python脚本(model.py定义ResNet…

2026/10/21 3:30:24 阅读更多 →
用大模型Agent做数据治理:三套Prompt模板搞定质量巡检、字段映射与敏感识别

用大模型Agent做数据治理:三套Prompt模板搞定质量巡检、字段映射与敏感识别

如果你的工作里也有这几件“重复但必须做”的事:业务部门隔三差五报“这个数不对”,你得翻几张表和一段段SQL去定位到底哪一环出了偏差;数据仓库里几十张表,字段命名五花八门,新人看一眼就头皮发麻;合规抽查…

2026/10/21 3:30:24 阅读更多 →
AI Agent工程化分水岭:OpenClaw与VibeCoding双引擎实战复盘

AI Agent工程化分水岭:OpenClaw与VibeCoding双引擎实战复盘

不用什么华丽的开场,直接说结论:2025 年我做了一整年 AI Agent 相关的落地项目,年头还在为"它能不能帮我写 SQL"折腾,年尾已经开始把 Agent 当正式同事排班上岗。这个过程中最深的体会是,真正拉开团队差距的…

2026/10/21 3:30:24 阅读更多 →
STM32F407贪吃蛇:嵌入式实时调度与LCD驱动实战

STM32F407贪吃蛇:嵌入式实时调度与LCD驱动实战

简介:本资源是一套基于STM32F407微控制器实现的经典贪吃蛇游戏完整嵌入式项目,面向嵌入式初学者与进阶开发者,聚焦MCU底层驱动开发与实时系统实践,有效解决理论脱离实操、外设协同难、中断与定时器应用模糊等学习痛点。压缩包共15…

2026/10/21 3:29:24 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →