Skip to content

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())

本站内容仅供学习和研究使用。