作业要求:
-
用户加密认证
-
允许同时多用户登录
-
每个用户有自己的家目录 ,且只能访问自己的家目录
-
对用户进行磁盘配额,每个用户的可用空间不同
-
允许用户在ftp server上随意切换目录
-
允许用户查看当前目录下文件
-
允许上传和下载文件,保证文件一致性
-
文件传输过程中显示进度条
-
附加功能:支持文件的断点续传
作业分析:
-
用户加密认证
客户端给服务端发生账号密码认证即可,认证成功进入即可,再安全就链接后验证一下客户端的一个编码
2. 允许同时多用户登录
服务端需要使用多进程,使用socketserver即可
3. 每个用户有自己的家目录 ,且只能访问自己的家目录
服务端使用用户登录成功后,默认执行cd 每个用户的家目录,执行命令时候是不需要真的去执行cd命令的.
class Userinfo: ''' 每次验证就会创建一个次类的对象,登录成功将下方构造信息初始化, 默认传入一个conn即可,由服务端链接去创建,并调用此处的逻辑 ''' def __init__(self, conn): self.conn = conn self.has_info = False # 用户是否登录 self.username = None # 用户账号 self.home = None # 用户家目录路径 self.size = None # 用户空间大小 self.use_size = None # 用户已经使用空间 self.path = None # 用户操作的路径 self.root = None # 当前用户操作的目录 def login(self): '''用户认证逻辑''' pass def post(self): '''上传文件逻辑''' pass def get(self): '''下载文件逻辑''' pass def commod(self): '''执行命令''' pass
注意:在返回的时候不能将一个绝对路径返回,只能返回一个以家目录为根之后的路径,如:[/alex]
4. 对用户进行磁盘配额,每个用户的可用空间不同
在用户配置文件设定文件夹大小和已经使用的大小,每次传文件的大小就需要判断是否超出值,超出报错,没超出就可以接收文件
5. 允许用户在ftp server上随意切换目录
每个用户登录后默认进入到自己的家目录,在执行cd 命令的时候,将家目录后面的文件夹返回即可。如果是家目录就不执行,返回一个0即可。
-
允许用户查看当前目录下文件
每个进程执行自己命令dir显示当前用户的文件夹下内容。
-
允许上传和下载文件,保证文件一致性
上传和下载基础,上传时候MD5计算下,传输完毕再验证下即可!
-
文件传输过程中显示进度条
写一个函数打印百分百和进度条,将已传文件大小和总文件大小传给函数打印即可
-
附加功能:支持文件的断点续传
判断上传文件是否存在,如果存在判断长度是多少,如果没有传过来的文件大,将服务端的长度发给客户端,客户端将光标移到文件位置继续读取,开始传送。
FTP规划
-
用户配置文件,家目录默认使用用户名称
[username]
pasw = password #用户密码
space_size=500000 #总共的大小
use_size = 0 #使用的大小
opentime = 2016-01-01 #开通时间
duetime= 2017-12-31 #到期时间
-
服务端命令集
post 上传 使用格式:post|file/path|默认为家目录下,/代表家目录,如果没有将创建
get 下载 使用格式:get|file/path|本地文件夹的绝对路径,默认为当前目录
cd/dir 目录查看命令 返回当前目录
-
使用socketserver搭建tcp服务端
cd.. 返回上一级目录
cd dirname 进入dirname路径 如果没有这个dir 返回一个错误值
cd / 返回家目录 直接返回家目录即可
以上为cd 命令的常用方法,固我需要固定每个用户登录后的家目录,需要确定每次执行后的目录即可,固用class去处理,代码如下: