Python 网络编程(Socket)详解
Socket 的核心用途
Socket 是网络通信的底层基石,它允许不同设备(或同一设备)上的程序通过 TCP/IP 协议栈交换数据。在 Python 中,socket
模块提供了对 BSD Socket API 的封装,支持 TCP、UDP 等协议。
服务器端代码(接收端 - 电脑 A)
import socket
def tcp_server():
# 创建 TCP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定到所有网络接口的 9999 端口
server_socket.bind(('0.0.0.0', 9999))
# 开始监听,设置最大连接数为 5
server_socket.listen(5)
print("TCP 服务器已启动,等待客户端连接...")
try:
# 接受客户端连接
client_socket, client_addr = server_socket.accept()
print(f"客户端 {client_addr} 已连接")
# 接收数据
data = client_socket.recv(1024)
print(f"收到消息: {data.decode('utf-8')}")
# 发送响应
response = "服务器已收到您的消息"
client_socket.send(response.encode('utf-8'))
except Exception as e:
print(f"发生错误: {e}")
finally:
# 关闭连接
client_socket.close()
server_socket.close()
print("服务器已关闭")
if __name__ == "__main__":
tcp_server()
客户端代码(发送端 - 电脑 B)
import socket
def tcp_client():
# 创建 TCP socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 服务器地址(改为电脑 A 的实际 IP)
server_ip = "192.168.1.100" # 替换为服务器真实 IP
server_port = 9999
try:
# 连接服务器
client_socket.connect((server_ip, server_port))
print(f"已连接到服务器 {server_ip}:{server_port}")
# 发送数据
message = "你好服务器!这是来自客户端的消息"
client_socket.send(message.encode('utf-8'))
print("消息已发送")
# 接收响应
response = client_socket.recv(1024)
print(f"服务器响应: {response.decode('utf-8')}")
except Exception as e:
print(f"连接失败: {e}")
finally:
# 关闭连接
client_socket.close()
print("客户端已关闭")
if __name__ == "__main__":
tcp_client()
在不同电脑上运行步骤
-
准备两台电脑
-
电脑 A(服务器):IP 地址
192.168.1.100
-
电脑 B(客户端):IP 地址
192.168.1.101
-
-
在电脑 A 上运行服务器
python server.py
python server.py # 输出: TCP 服务器已启动,等待客户端连接...
# 输出: TCP 服务器已启动,等待客户端连接... -
在电脑 B 上运行客户端
python client.py
python client.py # 输出: 已连接到服务器 192.168.1.100:9999 # 消息已发送 # 服务器响应: 服务器已收到您的消息 # 客户端已关闭
# 输出: 已连接到服务器 192.168.1.100:9999
# 消息已发送
# 服务器响应: 服务器已收到您的消息
# 客户端已关闭 -
查看电脑 A 的输出
# 输出: 客户端 ('192.168.1.101', 54321) 已连接
# 输出: 客户端 ('192.168.1.101', 54321) 已连接 # 收到消息: 你好服务器!这是来自客户端的消息 # 服务器已关闭
# 收到消息: 你好服务器!这是来自客户端的消息
# 服务器已关闭
关键配置说明
1. IP 地址设置
-
局域网通信:使用内网 IP(如
192.168.x.x
) -
跨网络通信:
-
服务器端需要公网 IP
-
在路由器设置端口转发(NAT)
-
2. 防火墙配置
-
服务器端:开放 TCP 9999 端口入站
-
客户端:允许 TCP 出站连接
Windows 防火墙设置:
-
控制面板 > Windows Defender 防火墙
-
高级设置 > 入站规则 > 新建规则
-
选择"端口" > TCP > 特定端口: 9999
-
允许连接 > 完成
Linux 防火墙设置:
sudo ufw allow 9999/tcp
3. 跨网络连接(端口转发)
如果服务器在 NAT 后面:
-
登录路由器管理界面
-
找到"端口转发"或"虚拟服务器"设置
-
添加规则:
-
外部端口:9999
-
内部 IP:192.168.1.100(服务器内网 IP)
-
内部端口:9999
-
协议:TCP
-
TCP 协议特点与最佳实践
TCP 与 UDP 对比
特性 | TCP | UDP |
---|---|---|
连接方式 | 面向连接(三次握手) | 无连接 |
可靠性 | 高(确认重传机制) | 低(可能丢包) |
数据顺序 | 保证顺序 | 不保证顺序 |
速度 | 较慢 | 较快 |
适用场景 | 文件传输、网页、数据库 | 实时视频、游戏、DNS |
最佳实践建议
-
异常处理:添加完善的错误处理
try: # 网络操作 except socket.error as e: print(f"网络错误: {e}") except ConnectionResetError: print("连接被对方重置") -
数据边界处理:TCP 是流式协议,需处理消息边界
# 添加消息长度前缀 message = "Hello Server!" header = len(message).to_bytes(4, 'big') # 4字节头部 client_socket.send(header + message.encode()) -
超时设置:避免无限期等待
client_socket.settimeout(10.0) # 10秒超时 -
多客户端处理:使用线程或异步处理
while True: client_sock, addr = server_socket.accept() # 创建新线程处理客户端 client_thread = threading.Thread(target=handle_client, args=(client_sock,)) client_thread.start() -
资源管理:使用
with socket.socket() as s: s.connect(('host', port)) s.send(b"data") # 退出时自动关闭with
语句自动关闭连接
实际应用场景
-
文件传输:可靠传输大文件
-
远程管理:SSH/Telnet 客户端
-
Web 服务:HTTP/HTTPS 通信
-
数据库连接:MySQL/PostgreSQL 客户端
-
消息队列:RabbitMQ/Kafka 生产者消费者
提示:对于高性能场景,可以考虑使用 Python 的
asyncio
库实现异步 TCP 服务器,能同时处理数千个连接。
通过 TCP 协议,您可以构建可靠的双向通信系统,适用于各种需要确保数据完整性的网络应用。
网络通信加密技术详解
在Python网络编程中,加密是确保数据安全的核心手段。以下是主流的加密方式及其在Socket通信中的应用:
一、加密方式分类与对比
加密类型 | 代表算法 | 密钥管理 | 速度 | 适用场景 |
---|---|---|---|---|
对称加密 | AES, DES, 3DES | 共享密钥 | ★★★★ | 大数据量传输 |
非对称加密 | RSA, ECC | 公钥/私钥对 | ★★ | 密钥交换、数字签名 |
混合加密 | TLS/SSL | 结合二者优势 | ★★★ | 安全通信标准 |
散列算法 | SHA-256, MD5 | 无密钥 | ★★★★ | 数据完整性验证 |