本章目标
本章将深入讲解 Python 的高级网络编程技术,协助你:
- 熟悉 socket 底层编程模型
- 掌握 TCP / UDP 协议差异及应用场景
- 学会使用 selectors 实现多路复用
- 掌握 asyncio 与 aiohttp 实现高并发网络通信
- 理解常见网络协议(HTTP、WebSocket、RPC)实现机制
1. socket 基础编程
import socket
# TCP 服务端
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind(('127.0.0.1', 5000))
server.listen()
print('Server listening...')
conn, addr = server.accept()
print('Connected by', addr)
data = conn.recv(1024)
print('Received:', data.decode())
conn.sendall(b'Hello client')
conn.close()
# TCP 客户端
client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client.connect(('127.0.0.1', 5000))
client.sendall(b'Hello server')
print(client.recv(1024).decode())
client.close()
2. UDP 编程
# UDP 服务端
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.bind(('127.0.0.1', 6000))
while True:
data, addr = s.recvfrom(1024)
print('Received from', addr, data.decode())
s.sendto(b'ACK', addr)
# UDP 客户端
import socket
c = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
c.sendto(b'Hello UDP', ('127.0.0.1', 6000))
print(c.recv(1024))
3. 多路复用 selectors
import selectors, socket
sel = selectors.DefaultSelector()
def accept(sock, mask):
conn, addr = sock.accept()
print('Accepted', addr)
conn.setblocking(False)
sel.register(conn, selectors.EVENT_READ, read)
def read(conn, mask):
data = conn.recv(1000)
if data:
conn.send(data)
else:
sel.unregister(conn)
conn.close()
sock = socket.socket()
sock.bind(('localhost', 7000))
sock.listen()
sock.setblocking(False)
sel.register(sock, selectors.EVENT_READ, accept)
while True:
for key, mask in sel.select():
key.data(key.fileobj, mask)
- 可高效管理上千个 socket 连接
4. asyncio 异步网络编程
import asyncio
async def handle(reader, writer):
data = await reader.read(100)
print('Received:', data.decode())
writer.write(b'Hi from server')
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle, '127.0.0.1', 8000)
async with server:
await server.serve_forever()
asyncio.run(main())
- asyncio 内置事件循环与协程调度机制
- 高并发、低资源占用
5. aiohttp 异步 HTTP 客户端与服务端
import aiohttp, asyncio
async def fetch(url):
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
return await resp.text()
async def main():
html = await fetch('https://www.python.org')
print(html[:200])
asyncio.run(main())
- aiohttp 支持 HTTP/HTTPS,适合编写高并发爬虫、API 客户端
6. WebSocket 与 RPC 通信
- WebSocket 提供持久双向通信,常用于实时聊天/推送
- Python 有 websockets、socket.io、fastapi-websocket
- RPC(远程过程调用)可以使用 xmlrpc, grpc, msgpack-rpc
# 简单 WebSocket 客户端
import asyncio, websockets
async def hello():
async with websockets.connect("ws://localhost:8765") as ws:
await ws.send("Hello")
print(await ws.recv())
asyncio.run(hello())
7. 网络安全注意事项
- 使用 TLS/SSL 加密通信 (ssl 模块)
- 设置 socket 超时与异常处理
- 合理控制并发数量,防止 DoS 攻击
- 使用认证与鉴权机制(JWT、OAuth2 等)
8. 练习题
- 编写一个支持多客户端的 TCP 聊天服务器。
- 使用 selectors 实现一个多连接 echo 服务器。
- 使用 aiohttp 编写一个并发下载器,同时下载多个网页。
- 使用 websockets 实现一个实时消息推送系统。
附图提议
- 图1:TCP 与 UDP 通信流程对比图
- 图2:多路复用事件循环结构图
- 图3:WebSocket 双向通信模型图
小结
本章深入介绍了 Python 网络编程的多种高级实现方式,包括 socket、selectors、asyncio、aiohttp、websocket 等,掌握这些技术可以开发出高性能、高并发的网络服务系统。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END















暂无评论内容