Python高级教程 第7章:Python高级网络编程技巧

本章目标

本章将深入讲解 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. 练习题

  1. 编写一个支持多客户端的 TCP 聊天服务器。
  2. 使用 selectors 实现一个多连接 echo 服务器。
  3. 使用 aiohttp 编写一个并发下载器,同时下载多个网页。
  4. 使用 websockets 实现一个实时消息推送系统。

附图提议

  • 图1:TCP 与 UDP 通信流程对比图
  • 图2:多路复用事件循环结构图
  • 图3:WebSocket 双向通信模型图

小结

本章深入介绍了 Python 网络编程的多种高级实现方式,包括 socket、selectors、asyncio、aiohttp、websocket 等,掌握这些技术可以开发出高性能、高并发的网络服务系统。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
平平的头像 - 鹿快
评论 抢沙发

请登录后发表评论

    暂无评论内容