第12章:Python 网络编程
Python 提供了强大的网络编程能力,从构建简单的客户端与服务器通信,到开发复杂的分布式系统,均能轻松实现。本章将带你深入了解 Python 的网络编程,包括使用标准库构建网络应用、处理 HTTP 请求,以及开发基于异步的高效网络服务。
12.1 网络编程基础
12.1.1 什么是网络编程?
网络编程是通过编写代码实现设备之间的通信,包括:
- 客户端:发起请求并接收响应。
- 服务器:接收请求并返回响应。
Python 提供了多个内置模块支持网络编程:
- socket:底层网络接口,支持 TCP/UDP 协议。
- http.client:HTTP 客户端接口。
- requests:更高效的第三方 HTTP 请求库。
- asyncio:支持异步网络编程。
12.1.2 网络协议基础
常用网络协议包括:
- TCP(传输控制协议):可靠的数据传输协议,面向连接。
- UDP(用户数据报协议):不可靠的数据传输协议,面向无连接。
TCP 与 UDP 的主要区别
特性 | TCP | UDP |
---|---|---|
连接方式 | 面向连接 | 无连接 |
数据传输可靠性 | 高可靠 | 可能丢失数据 |
速度 | 较慢 | 较快 |
应用场景 | 文件传输、Web | 视频流、实时通信 |
12.2 使用 socket 模块进行网络编程
Python 的 socket 模块是底层网络编程的核心。
12.2.1 构建 TCP 客户端与服务器
TCP 服务器
import socket
# 创建服务器套接字
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(('localhost', 8080))
server_socket.listen(5) # 监听最多 5 个连接
print("Server is running on port 8080...")
while True:
client_socket, addr = server_socket.accept()
print(f"Connection established with {addr}")
client_socket.send(b"Hello, Client!")
client_socket.close()
TCP 客户端
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(('localhost', 8080)) # 连接服务器
message = client_socket.recv(1024) # 接收消息
print(f"Received from server: {message.decode()}")
client_socket.close()
12.2.2 构建 UDP 客户端与服务器
UDP 服务器
import socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_socket.bind(('localhost', 8080))
print("UDP Server is running on port 8080...")
while True:
data, addr = server_socket.recvfrom(1024) # 接收数据
print(f"Received message: {data.decode()} from {addr}")
server_socket.sendto(b"Hello, UDP Client!", addr)
UDP 客户端
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
client_socket.sendto(b"Hello, Server!", ('localhost', 8080))
message, server_addr = client_socket.recvfrom(1024)
print(f"Received from server: {message.decode()}")
client_socket.close()
12.3 使用 requests 模块进行 HTTP 编程
requests 是一个功能强大的第三方 HTTP 库,支持发送各种类型的 HTTP 请求。
12.3.1 安装 requests
pip install requests
12.3.2 发送 GET 请求
import requests
response = requests.get("https://jsonplaceholder.typicode.com/posts/1")
if response.status_code == 200:
print(response.json())
12.3.3 发送 POST 请求
import requests
data = {
"title": "foo",
"body": "bar",
"userId": 1
}
response = requests.post("https://jsonplaceholder.typicode.com/posts", json=data)
print(response.status_code)
print(response.json())
12.4 异步网络编程
使用 asyncio 模块,可以高效处理大规模的异步 I/O 操作。
12.4.1 异步 HTTP 请求
示例:使用 aiohttp
import aiohttp
import asyncio
async def fetch_url(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch_url(session, "https://www.python.org")
print(html)
asyncio.run(main())
12.4.2 异步 TCP 服务器与客户端
异步 TCP 服务器
import asyncio
async def handle_client(reader, writer):
addr = writer.get_extra_info('peername')
print(f"Connection established with {addr}")
writer.write(b"Hello, Async Client!")
await writer.drain()
writer.close()
async def main():
server = await asyncio.start_server(handle_client, 'localhost', 8080)
print("Async TCP Server is running on port 8080...")
async with server:
await server.serve_forever()
asyncio.run(main())
异步 TCP 客户端
import asyncio
async def main():
reader, writer = await asyncio.open_connection('localhost', 8080)
data = await reader.read(100)
print(f"Received: {data.decode()}")
writer.close()
asyncio.run(main())
12.5 网络安全编程
12.5.1 使用 SSL 加密通信
Python 的 ssl 模块支持安全的 HTTPS 通信。
示例:创建 SSL 套接字
import ssl
import socket
context = ssl.create_default_context()
with socket.create_connection(('www.python.org', 443)) as sock:
with context.wrap_socket(sock, server_hostname='www.python.org') as ssock:
print(ssock.version())
12.5.2 防御常见网络攻击
- SQL 注入:使用参数化查询。
- XSS 攻击:对用户输入进行过滤或转义。
- CSRF 攻击:通过添加 CSRF 令牌防护。
12.6 小结
本章内容涵盖了:
- 基础网络编程:使用
socket
实现 TCP/UDP 通信。 - HTTP 编程:利用
requests
和aiohttp
进行 HTTP 请求。 - 异步网络编程:基于
asyncio
开发高效的网络服务。 - 网络安全编程:介绍 SSL 和常见的安全防护措施。