Python 网络编程
网络编程允许计算机通过网络相互通信。Python 提供了多个功能强大的库,使得创建客户端和服务器应用程序变得相对简单。本章将介绍两个核心的网络编程模块:socket 用于底层网络通信,requests 用于高层的 HTTP 通信。
核心概念
- 套接字 (Socket): 是网络通信的基石。你可以把它想象成网络连接的一个端点,就像一个电话插座。两台计算机需要通过套接字建立连接才能交换数据。
- IP 地址: 网络上每台计算机的唯一标识符(如
192.168.1.1)。 - 端口 (Port): 一个 16 位的数字(0-65535),用于标识一台计算机上的特定应用程序或服务。例如,HTTP 服务通常在 80 端口,HTTPS 在 443 端口。
- 协议 (Protocol): 控制数据如何在网络上传输的规则集。最常见的有 TCP 和 UDP。
- TCP (传输控制协议): 面向连接、可靠的协议。它确保数据按顺序、无差错地到达。适用于文件传输、网页浏览等需要高可靠性的场景。
- UDP (用户数据报协议): 无连接、不可靠的协议。它只是尽力发送数据,但不保证数据会到达或按顺序到达。适用于视频流、在线游戏等速度比可靠性更重要的场景。
socket 模块:底层网络编程
socket 模块提供了对底层套接字接口的访问。下面是一个简单的 TCP 服务器和客户端的例子。
TCP 服务器 (server.py)
python
import socket
# 1. 创建一个 socket 对象
# AF_INET 表示使用 IPv4 地址
# SOCK_STREAM 表示使用 TCP 协议
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 绑定 IP 地址和端口
host = '127.0.0.1' # 本机地址
port = 9999
server_socket.bind((host, port))
# 3. 开始监听客户端连接,5 表示最多允许 5 个连接排队
server_socket.listen(5)
print(f"服务器正在监听 {host}:{port}")
while True:
# 4. 等待并接受一个新的连接
# accept() 会阻塞程序,直到有客户端连接进来
client_socket, addr = server_socket.accept()
print(f"收到了来自 {addr} 的连接")
# 5. 向客户端发送消息
# 字符串需要编码成字节
message = '欢迎连接到服务器!' + "\r\n"
client_socket.send(message.encode('utf-8'))
# 6. 关闭客户端连接
client_socket.close()TCP 客户端 (client.py)
python
import socket
# 1. 创建一个 socket 对象
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 连接到服务器
host = '127.0.0.1'
port = 9999
client_socket.connect((host, port))
# 3. 接收来自服务器的数据
# 1024 是缓冲区大小,表示一次最多接收 1024 字节
data = client_socket.recv(1024)
# 4. 打印接收到的数据(解码成字符串)
print(f"收到: {data.decode('utf-8')}")
# 5. 关闭连接
client_socket.close()requests 库:高层 HTTP 编程
对于大多数 Web 相关的开发(如调用 API、爬取网页),直接使用 socket 会非常繁琐。requests 是一个非常流行且用户友好的第三方库,专门用于发送 HTTP 请求。
首先,你需要安装它: pip install requests
发送 GET 请求
GET 请求用于从服务器获取数据。
python
import requests
# 发送一个 GET 请求到指定的 URL
response = requests.get('https://api.github.com')
# 检查请求是否成功 (状态码 200)
if response.status_code == 200:
print("请求成功!")
# response.json() 会自动将 JSON 格式的响应体解码为 Python 字典
data = response.json()
print(data)
else:
print(f"请求失败,状态码: {response.status_code}")发送 POST 请求
POST 请求用于向服务器提交数据(例如,提交一个表单)。
python
import requests
url = 'https://httpbin.org/post'
# 要发送的数据
payload = {'key1': 'value1', 'key2': 'value2'}
# 发送 POST 请求
response = requests.post(url, data=payload)
# 打印服务器返回的响应
print(response.json())