使用Python的socketserver框架实现文件上传和下载服务
概述
在现代网络应用中,文件上传和下载功能是常见的需求。Python提供了一个强大的内建库socketserver
,可以用来简化网络服务的开发。本文将介绍如何使用socketserver
框架来实现一个基本的文件上传和下载服务。
环境准备
确保你的Python环境已安装。本教程适用于Python 3.7及以上版本。
python3 --version
socketserver 简介
socketserver
模块提供了一个简单的方式创建网络服务器。它包括对TCP、UDP等协议的基本支持,并且可以轻松扩展。
实现文件服务器
我们将创建一个简单的文件服务器,它允许客户端上传文件和下载文件。
1. 创建服务器
文件服务器代码:server.py
import socketserver
class FileRequestHandler(socketserver.BaseRequestHandler):
def handle(self):
self.data = self.request.recv(1024).strip()
print(f"Received: {self.data}")
if self.data.startswith('GET'):
filename = self.data[4:]
with open(filename, 'rb') as f:
self.request.send(f.read())
elif self.data.startswith('PUT'):
filename = self.data[4:]
with open(filename, 'wb') as f:
while True:
data = self.request.recv(1024)
if not data:
break
f.write(data)
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
server = socketserver.ThreadingTCPServer((HOST, PORT), FileRequestHandler)
print(f"Serving on {HOST}:{PORT}")
server.serve_forever()
2. 解释代码
- FileRequestHandler:处理客户端请求。
- handle():接收客户端命令,执行文件读取(GET)或写入(PUT)。
- GET命令:读取指定文件并发送给客户端。
- PUT命令:接收客户端发送的文件数据并保存。
3. 启动服务器
在终端中运行:
python3 server.py
客户端实现
客户端代码:client.py
import socket
def get_file(host, port, filename):
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.sendall(f"GET {filename}".encode())
with open(filename, 'wb') as f:
while True:
data = s.recv(1024)
if not data:
break
f.write(data)
def put_file(host, port, local_filename, remote_filename):
with open(local_filename, 'rb') as f:
file_data = f.read()
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((host, port))
s.sendall(f"PUT {remote_filename}".encode())
s.sendall(file_data)
if __name__ == "__main__":
HOST, PORT = "localhost", 9999
get_file(HOST, PORT, "example.txt")
put_file(HOST, PORT, "localfile.txt", "remotefile.txt")
4. 使用客户端
下载文件:
python3 client.py
上传文件:
修改client.py
中的localfile.txt
和remotefile.txt
为你的目标文件名和路径。