作业:开发一个支持多用户在线的FTP程序
要求:
- 用户加密认证
- 允许同时多用户登录
- 每个用户有自己的家目录 ,且只能访问自己的家目录
- 对用户进行磁盘配额,每个用户的可用空间不同
- 允许用户在ftp server上随意切换目录
- 允许用户查看当前目录下文件
- 允许上传和下载文件,保证文件一致性
- 文件传输过程中显示进度条
- 附加功能:支持文件的断点续传
之前作业的链接地址:https://www.cnblogs.com/hukey/p/8909046.html 这次的重写是对上次作业的补充,具体实现功能点如下:
README
# 作者介绍: author: hkey # 博客地址: https://www.cnblogs.com/hukey/p/10182876.html # 功能实现: 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ,且只能访问自己的家目录 对用户进行磁盘配额,每个用户的可用空间不同 允许用户在ftp server上随意切换目录 允许用户查看当前目录下文件 允许上传和下载文件,保证文件一致性 文件传输过程中显示进度条 附加功能:支持文件的断点续传 # 目录结构: FTP ├── ftp_client/ # ftp客户端程序 │ └── ftp_client.py # 客户端主程序 └── ftp_server/ # ftp服务端程序 ├── bin/ │ ├── __init__.py │ └── start.py ├── conf/ # 配置文件目录 │ ├── __init__.py │ ├── settings.py │ └── user.list # 记录注册用户名 ├── db/ # 用户数据库 ├── home/ # 用户家目录 ├── logs/ # 记录日志目录 └── modules/ # 程序核心功能目录 ├── auth.py # 用户认证(注册和登录) ├── __init__.py ├── log.py # 日志初始化类 └── socket_server.py # socket网络模块 # 功能实现: 1. 实现了用户注册和登录验证(新增)。 2. 用户注册时,将用户名添加到 conf/user.list里并创建home/[username],为每个用户生成独立的数据库文件 db/[username].db 2. 每个用户的磁盘配额为10M, 在conf/settings.py 中声明, 可以修改 3. 本程序适用于windows,命令:cd / mkdir / pwd / dir / put / get 4. 实现了get下载续传的功能: 服务器存在文件, 客户端不存在,直接下载; 服务器存在文件, 客户端也存在文件,比较大小, 一致则不传,不一致则追加续传; 5. 实现日志记录(新增) # 状态码: 400 登录验证(用户名或密码错误) 401 注册验证(注册的用户名已存在) 402 命令不正确 403 空间不足 405 续传 406 get(客户端文件存在) 200 登录成功 201 注册成功 202 命令执行成功 203 文件一致 000 系统交互码
程序结构
具体代码实现
1. ftp客户端程序
#!/usr/bin/python3 # -*- coding: utf-8 -*- # Author: hkey import os, sys import socket class MyClient: def __init__(self, ip_port): self.client = socket.socket() self.ip_port = ip_port def connect(self): self.client.connect(self.ip_port) def start(self): self.connect() while True: print('注册(register) 登录(login)') auth_type = input('>>>').strip() if not auth_type: continue if auth_type == 'register' or auth_type == 'login': user = input('用户名:').strip() pwd = input('密码:').strip() auth_info = '%s:%s:%s' % (auth_type, user, pwd) self.client.sendall(auth_info.encode()) status_code = self.client.recv(1024).decode() if status_code == '200': print('