一、作业需求
要求:
用户加密认证 1
允许同时多用户登录 1
每个用户有自己的家目录 ,且只能访问自己的家目录 1
对用户进行磁盘配额,每个用户的可用空间不同
允许用户在ftp server上随意切换目录 1
允许用户查看当前目录下文件 1
允许上传和下载文件,保证文件一致性 1
文件传输过程中显示进度条 1
附加功能:支持文件的断点续传---------------------未完成
二、作业分析
> 大致结构
client
server
> 各个点的解释
在这个作业中呢,用到了很多知识点,比如用户加密认证、加密传送文件都用到了hashlib模块;保存用户信息,传递一些字典用到了json模块;多用户同时在线用到了socketserver模块;还有一些命令的操作,用到了os.popen()函数;还有一些有关路径的函数,什么的。。。诶,好像也没用到好多哈。。。对了还有反射,这个非常重要。其他就没什么的了,,具体看下面的一个网站:
推荐这个网址:点开即可
这里面讲的都挺详细的,正式因为看到这个才会有点思路写,推荐去看一下。
> client代码
main
import socket,hashlib,json,os ,sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(base_dir)
sys.path.append(base_dir) # 添加conf文件的路径\\
from conf import config
from core import put, auth, ls, cd, mkdir
httpCode = """
"200" : "服务器成功返回网页"
"404" : "请求的网页不存在"
"403" : "出现错误"
"503" : "服务不可用"
"""
class FtpClient(object):
def __init__(self):
self.client = socket.socket() # 创建一个socket客户端
self.userMessDirt = {
}
def connect(self,host,port):
self.client.connect((host, port)) # 客户端和服务器端进行连接
def help(self):
msg = '''
ls
pwd
cd ../..
get filename
put filename
'''
print(msg)
def interactive(self):
self.userMessDirt = json.loads(self.client.recv(config.buffer).decode())
self.localDir = os.path.basename(self.userMessDirt["homeDir"]) # 初始地址
while True:
cmd_str = input("[%s@user %s] #" %(self.userMessDirt["userName"], self.localDir))
if len(cmd_str) ==0:continue
cmd = cmd_str.split()[0]
if hasattr(self,"cmd_%s" % cmd):
func = getattr(self, "cmd_%s" % cmd)
func(cmd_str)
else:
self.help()
def cmd_ls(self, *args):
'''客户端实现打印出该目录下的所有文件'''
ls.ls(self, *args)
def cmd_pwd(self, *args):
'''客户端实现打印出当前目录功能'''
pass
def cmd_cd(self, *args):
'''客户端实现切换目录功能'''
cd.cd(self, *args)
def cmd_get(self, *args):
'''客户端下载文件'''
pass
def cmd_put(self, *args):
'''客户端上传文件'''
put.cmd_put(self,*args)
def cmd_mkdir(self, *args):
'''创建一个空文件夹'''
mkdir.mkdir(self, *args)
def auth_login(self):
auth.auth_login(self)
def auth_register(self):
auth.auth_register(self)
def run():
info = """
1.登录
2.注册
>>:"""
auth_choice = input(info).strip()
ftp = FtpClient()
ftp.connect("localhost",9090)
if auth_choice == "1":
ftp.auth_login()
else:
ftp.auth_register()
ftp.interactive()
client.auth:
import hashlib, os, sys
base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
from conf import config
def auth_login(self):
self.client.send("login".encode("utf-8")) # 通知对面我要登录了
loginErrorCount = 3
while True:
userName_input = self.client.recv(config.buffer)
userName = input(userName_input.decode()).strip()
self.client.send(userName.encode("utf-8")) # 注意这里的编码问题
httpCode = self.client.recv(config.buffer).decode()
if httpCode == "403":
print("用户名错误,请重新输入")
elif httpCode == "200":
break
while loginErrorCount