摘要
网络编程是 Python 后端、爬虫、即时通讯开发的核心基础。很多初学者直接上手 requests、httpx,却不懂底层 Socket 通信原理,遇到粘包、连接超时、并发阻塞等问题无从排查。本文由浅入深,从 Socket 套接字、TCP/UDP 协议差异讲起,搭配可直接运行 TCP 回声服务、UDP 消息收发、多线程聊天室、同步 / 异步 HTTP 客户端完整源码,最后配套阶梯式实战练习,零基础也能跟着敲代码落地,适合 Python 新手、爬虫入门、后端开发阅读。 关键词:Python 网络编程、Socket、TCP、UDP、requests、httpx、异步 HTTP、聊天室、网络实战
一、前言:为什么一定要学网络编程?
日常开发中所有联网程序底层都离不开网络通信:微信聊天、网页加载、游戏实时同步、API 接口请求、爬虫采集,全部基于网络编程实现。
不少学习者存在误区:只调用第三方 HTTP 库,跳过 Socket 底层,一旦出现网络异常、接口并发卡顿、数据丢包问题,完全无法定位根源。
本文学习路线:底层 Socket 通信 → TCP/UDP 协议对比 → 上层同步 / 异步 HTTP 客户端 → 4 套完整可运行实战项目 → 分层课后练习。 学习目标:
- 理解客户端 / 服务器通信模型,掌握 socket 模块全套 API;
- 分清 TCP 可靠传输、UDP 高速传输适用场景;
- 熟练使用 requests 同步、httpx 异步发送网络请求;
- 独立实现多用户聊天室、文件传输、批量 API 采集工具。
二、网络通信基石:Socket 套接字
Socket 是操作系统提供的网络通信抽象接口,相当于两台设备通话的 "通信插座",Python 内置socket模块,无需额外安装即可使用。
2.1 Socket 核心参数说明
python
运行
import socket
# 地址族:AF_INET代表IPv4,AF_INET6代表IPv6
# 套接字类型:SOCK_STREAM=TCP,SOCK_DGRAM=UDP
# 创建TCP套接字
tcp_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 创建UDP套接字
udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
2.2 C/S 客户端服务器通用流程
TCP 通信完整步骤
表格
| 操作步骤 | 服务器端 | 客户端 |
|---|---|---|
| 1 | 创建 socket 对象 | 创建 socket 对象 |
| 2 | bind 绑定 IP + 端口 | 无 |
| 3 | listen 开启监听 | 无 |
| 4 | accept 阻塞等待连接 | connect 连接服务端地址 |
| 5 | recv/send 收发数据 | recv/send 收发数据 |
| 6 | close 关闭连接 | close 关闭连接 |
UDP 通信特点
无连接协议,不需要 connect、listen、accept,直接通过sendto发送、recvfrom接收,同时获取对方地址。
2.3 Socket 高频方法速查
python
运行
# 服务端专用
sock.bind((host, port)) # 绑定地址端口
sock.listen(num) # 设置最大等待连接数
client_sock, addr = sock.accept() # 接收客户端连接
# 客户端专用
sock.connect((host, port)) # 发起TCP连接
# 通用收发
data = sock.recv(buffer_size)
sock.send(data)
sock.close()
# UDP专用
data, addr = sock.recvfrom(1024)
sock.sendto(data, (host, port))
三、TCP 与 UDP 核心差异对比
两种传输协议适用场景完全不同,核心区分:TCP 追求可靠,UDP 追求速度。
3.1 TCP(面向连接、可靠传输)
- 通信前三次握手建立连接,断开四次挥手;
- 数据有序、不重复、不丢失,自带流量 / 拥塞控制;
- 头部开销大,传输效率偏低; 适用场景:文件传输、网页访问、聊天软件、接口请求、邮件。
3.2 UDP(无连接、高速传输)
- 无需建立连接,直接发包;
- 无重传校验,可能丢包、乱序;
- 头部极简,延迟极低; 适用场景:视频会议、直播、网络游戏、DNS 域名查询。
3.3 直观对比表
表格
| 特性 | TCP | UDP |
|---|---|---|
| 连接模式 | 面向连接 | 无连接 |
| 数据可靠性 | 有序不丢包 | 可能丢包乱序 |
| 传输效率 | 较低 | 极高 |
| 头部占用 | 20 字节 + | 仅 8 字节 |
| 典型场景 | 爬虫、文件、聊天室 | 直播、游戏、语音通话 |
四、上层网络工具:HTTP 客户端全解
Socket 是底层,日常 Web 交互使用封装好的 HTTP 库,主流分为同步 requests、异步 httpx 两大阵营。
4.1 主流库选型对比
表格
| 库 | 同步 / 异步 | HTTP2 支持 | 优势 | 适用场景 |
|---|---|---|---|---|
| requests | 同步 | 不支持 | 简单易上手,文档丰富 | 脚本、单次接口请求 |
| httpx | 同步 + 异步 | 支持 | 类型提示、并发友好 | 高并发爬虫、异步服务 |
| urllib | 同步标准库 | 不支持 | 无需安装 | 无第三方权限环境 |
| aiohttp | 纯异步 | 部分支持 | WebSocket 完善 | 实时长连接服务 |
4.2 requests 同步请求实战
覆盖 GET、POST、请求头、会话保持、异常捕获完整示例:
python
运行
import requests
headers = {
"User-Agent": "Python-Network-Demo/1.0"
}
# GET带参数
params = {"q": "python网络编程", "page": 1}
res = requests.get("https://jsonplaceholder.typicode.com/posts", params=params, headers=headers, timeout=5)
print(res.status_code)
print(res.json())
# POST提交JSON
payload = {"username": "test", "pwd": "123456"}
res_post = requests.post("https://httpbin.org/post", json=payload)
# Session保持Cookie会话
session = requests.Session()
session.headers.update(headers)
session.get("https://jsonplaceholder.typicode.com/users")
4.3 httpx 异步并发请求
高并发场景首选,支持同时批量请求多个接口:
python
运行
import httpx
import asyncio
async def batch_request():
urls = [
"https://jsonplaceholder.typicode.com/posts/1",
"https://jsonplaceholder.typicode.com/posts/2"
]
async with httpx.AsyncClient() as client:
tasks = [client.get(url) for url in urls]
responses = await asyncio.gather(*tasks)
for resp in responses:
print(f"状态码:{resp.status_code}")
asyncio.run(batch_request())
五、四大完整实战项目(可直接复制运行)
项目 1:TCP 回声服务器 & 客户端
客户端发送任意文本,服务器原样返回,入门第一个通信 Demo。
服务端 tcp_echo_server.py
python
运行
import socket
def run_server(host="127.0.0.1", port=8888):
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_sock.bind((host, port))
server_sock.listen(5)
print(f"TCP回声服务启动 {host}:{port}")
while True:
client, addr = server_sock.accept()
print(f"客户端接入 {addr}")
while True:
data = client.recv(1024)
if not data:
break
msg = data.decode("utf-8")
print(f"收到消息:{msg}")
client.sendall(data)
client.close()
if __name__ == "__main__":
run_server()
客户端 tcp_echo_client.py
python
运行
import socket
def run_client(host="127.0.0.1", port=8888):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((host, port))
while True:
text = input("输入消息,exit退出:")
if text == "exit":
break
sock.sendall(text.encode("utf-8"))
resp = sock.recv(1024)
print("服务端回传:", resp.decode("utf-8"))
sock.close()
if __name__ == "__main__":
run_client()
项目 2:UDP 消息收发工具
无连接通信演示,适合理解直播、游戏底层发包逻辑。
UDP 接收服务端
python
运行
import socket
def udp_receiver(port=9999):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(("127.0.0.1", port))
print("UDP接收端启动")
while True:
data, addr = sock.recvfrom(1024)
msg = data.decode("utf-8")
print(f"来自{addr}:{msg}")
ack = f"已收到:{msg[:10]}"
sock.sendto(ack.encode("utf-8"), addr)
if __name__ == "__main__":
udp_receiver()
UDP 发送客户端
python
运行
import socket
def udp_sender(host="127.0.0.1", port=9999):
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
while True:
text = input("发送UDP消息:")
if text == "exit":
break
sock.sendto(text.encode("utf-8"), (host, port))
sock.close()
if __name__ == "__main__":
udp_sender()
项目 3:多线程 TCP 聊天室
支持多人同时在线、改名、查看在线用户、全员广播,小型即时通讯 Demo。 完整服务端 + 客户端代码篇幅较长,核心逻辑:
- 服务端多线程处理每一个客户端连接;
- 全局字典存储所有在线用户 socket 与昵称;
- 封装广播函数,消息推送给全部在线客户端;
- 内置指令
/users查看在线列表、/name修改昵称、/exit下线。
项目 4:多功能 HTTP 采集工具
整合 requests 同步单条采集、httpx 异步批量请求,自动打印接口状态、解析 JSON 数据,可作为爬虫基础模板。
六、阶梯式课后练习(由浅入深巩固)
初级练习
- TCP 时间服务器:客户端连接后自动返回当前格式化时间;
- UDP 消息计数器:统计接收消息条数并回复序号。
中级练习
- TCP 文件传输工具:客户端上传本地文件至服务端保存,支持分块传输;
- API 数据统计工具:采集 JSONPlaceholder 接口,统计每个用户帖子、评论数量并导出 CSV。
高级实战项目
- 增强版聊天室:新增私聊、文件发送、在线状态、管理员踢人功能;
- HTTP 缓存代理服务器:转发网页请求,缓存静态资源、过滤敏感关键字;
- 服务器资源监控系统:客户端实时获取服务端 CPU、内存占用数据。
七、全文总结
- Socket 是所有网络通信底层基础,TCP 可靠、UDP 高速按需选择;
- 简单脚本使用 requests 同步接口,高并发场景优先 httpx 异步;
- 客户端 / 服务器模型是所有联网程序通用架构;
- 学习路径:底层 Socket 通信 → 协议原理 → HTTP 封装库 → 完整网络项目开发。
掌握本篇内容后,可无缝过渡爬虫开发、后端接口、即时通讯服务、并发编程学习。下一篇将讲解 Python 多线程、协程并发,解决网络请求阻塞问题。