MYFTP是我写的模拟FTP服务端和客户端交互的程序。通过使用socket去模拟ftp的文件下载与上次两个核心功能。并不是使用真实FTP协议去实现。
基本需求
- 用户加密认证 # hashlib模块对用户名密码进行加密。
- 允许同时多用户登录
- 每个用户有自己的家目录,且只能访问自己的家目录 # 使用用户名在配置文件的固定目录中添加用户名的目录。并可以实现ls,dir功能
- 对用户进行磁盘配额,每个用户的可用空间不同 # 使用os模块检查用户目录的空间+上文件大小,如果大于quota就不让传输。
- 允许用户在ftp server上随意切换目录 cd功能 记录用户输入的目录,进行目录的拼接。
- 允许用户查看当前目录下文件 ls功能
- 允许上传和下载文件,保证文件一致性(md5)
- 文件传输过程中显示进度条
- 附加功能:支持文件的断点续传。比较客户端文件与服务端文件的bytes,如果不一致。客户端、服务端就使用文件seek方法移动光标。续传。
需求模型
用例名
MYFTP
场景
- when:任意时间
- where:任何地点
- who:FTP用户
用例描述
- ftp使用用户名密码登录。密码需要加密认证、允许支持多用户登录。
- 每个用户有自己的家目录,所有的访问必须限制在用户的家目录。但在家目录中创建的目录可以进行目录切换。
- 用户的目录有磁盘配额。不允许超过磁盘配额。
- 用户可以查看当前目录下的文件列表。
- 用户可以上传和下载文件,并且保证文件的一致性。
- 文件的传输过程中显示精度条。
- 支持断点续传。
用户价值
实现一套自己的FTP服务端与客户端。
约束
暂无
建模设计
UML图
顺序图
- 登录顺序图
- 上传顺序图
程序讲解
程序主体
目录结构
+---bin # 执行程序目录
| create_user.py # 创建用户程序
| myftpc.py # ftp_server启动程序
| myftps.py # ftp_client启动程序
| __init__.py
|
+---conf
| | settings.py # 配置文件
| | __init__.py
| |
| \---__pycache__
|
+---core
| | logger.py # 日志生成文件
| | main.py # 主程序文件
| | __init__.py
| |
| \---__pycache__
|
+---db # 数据库目录
| \---accounts # 账号表目录
|---id_user_rs.json # 账号ID与用户名对应关系
+---file_upload # ftp文件服务器目录
+---lib # 类文件
| | account.py # 账号类
| | db.py # 数据库类
| | myftp_client.py # ftp客户端类
| | myftp_server.py # ftp服务端类
| | process.py # 进度条展示类(暂时未使用)
| | __init__.py
| |
| \---__pycache__
\---log
__init__.py
环境
本系统基于python 3.6版本开发。可运行在安装了python 3.6版本的linux或windows系统中。
用法
创建FTP用户
进入bin目录:
> cd bin
执行create_user.py:
> python ./create_user.py
Account:test2 # 用户名
Password:test2 # 密码
Home directory(test2): # 账号的根目录。默认为账号名称
Quota(bytes):10 # 账号的quota。默认为1G
===================ACCOUNT INFO===================
Account: test2
Home Dir: test2
Quota: 10
==================================================
启动ftp服务端
进入bin目录:
> cd bin
执行create_user.py:
> python ./myftps.py
启动ftp客户端
进入bin目录:
> cd bin
执行create_user.py:
> python ./myftpc.py
FTP用于登录:
Name:test2
Password:test2
Account [test2] login successful
ftp>:
客户端命令
-
ls: 查看用户当前目录的文件和目录列表
ftp>: ls 驱动器 D 中的卷是 新加卷 卷的序列号是 020D-6062 D:\deployment\MYFTP\file_upload\test2 的目录 2018/04/16 12:17 <DIR> . 2018/04/16 12:17 <DIR> .. 0 个文件 0 字节 2 个目录 45,605,543,936 可用字节 Directory [test2] list successful. ftp>:
-
pwd: 查看当前所在目录
ftp>: pwd Directory [\] show successful.
-
mdir: 创建目录
ftp>: mdir temp_dir Directory [temp_dir] create successful.
-
cd:切换目录
ftp>: cd temp_dir Directory [temp_dir] change successful.
-
put: 上传文件-支持断点续传
ftp>: get temp_file.md Start download -----> temp_file.md trandata: %s b'test123' [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100% recvsize:7, filesize:7 File [temp_file.md] download successful.
-
get: 下载文件-支持断点续传
ftp>: put temp_file.md [>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>]100% File [temp_file.md] upload successful.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。