- 功能要求
1. 用户加密认证
2. 服务端采用 SocketServer实现,支持多客户端连接
3. 每个用户有自己的家目录且只能访问自己的家目录
4. 对用户进行磁盘配额、不同用户配额可不同
5. 用户可以登陆server后,可切换目录
6. 能查看当前目录下文件
7. 上传下载文件,保证文件一致性
8. 传输过程中实现进度条展示
9.用户可在自己家目录进行创建目录、文件、删除目录及文件
10.服务端可实现增加用户、删除用户
11.支持上传时断点续传
- 应用知识点
a) 类的应用
b) 函数的使用
c) 多进程
d) 反射
e) socket、socketserver、hashlib、configparser、logging
f) 文件的读写
- 开发环境
- python 3.6.1
- PyCharm 2016.2.3
- 目录结构
FTPClient
|--bin (主接口目录)
|--ftpclient.py (客户端主程序接口文件)
|--config (配置文件目录)
|--code.py (状态码文件)
|--settings.py (配置文件)
|--template.py (模板文件)
|--download (下载存放目录)
|--lib (模块目录)
|--client.py (客户端各类接口封装)
|--common.py (公共接口)
|--logs (日志目录)
|--ftpclient.log (日志文件)
|--clientRun.py (主执行程序)
FTPServer
|--bin (主接口目录)
|--ftpserver.py (服务端socket接口文件)
|--main.py (主程序接口文件)
|--config (配置目录)
|--settings.py (配置文件)
|--template.py (模板文件)
|--database (数据保存目录)
|--user.ini (用户信息文件)
|--dbhelper (数据目录)
|--dbapi.py (数据操作接口)
|--lib (模块目录)
|--user.py (用户类文件用来实例化对象)
|--server.py (服务端模块,各类所有命令方法)
|--common.py (公共模块文件)
|--logs
|--ftpserver.log (日志文件)
|--upload (上传文件存放的目录)
|--serverRun.py (主执行程序)
- 模块功能系统图
1、思维导图
2、功能接口关系图
客户端:
服务端:
- 关键代码段
1、服务端
1 #!/usr/bin/env python 2 #coding=utf-8 3 __author__ = 'yinjia' 4 5 6 import socketserver,os,sys 7 sys.path.append(os.path.dirname(os.path.dirname(__file__))) 8 from config import settings,template 9 from lib import common,server 10 11 12 13 logger = common.Logger('ftpserver').getlog() 14 15 class MyServer(socketserver.BaseRequestHandler): 16 17 def handle(self): 18 try: 19 client_socket = self.request 20 client_addr = self.client_address 21 logger.info("client {0} connected".format(client_addr)) 22 #发送成功标识给客户端 23 client_socket.sendall(bytes("OK",encoding='utf-8')) 24 client_user = None 25 26 while True: 27 #获取客户端命令 28 ret_client_data = str(client_socket.recv(1024),encoding='utf-8') 29 30 #判断客户端是否退出 31 if ret_client_data == b'': 32 logger.info("client {0} is exit".format(client_addr)) 33 client_socket.close() 34 35 #取出客户端命令 36 cmd = ret_client_data.split("|")[0] 37 38 logger.info("client {0} send command {1}".format(client_addr,cmd)) 39 #判断是否登录认证状态 40 if cmd == 'auth': 41 client_user = server.client_auth(client_socket, ret_client_data) 42 else: 43 try: 44 #通过反射寻找模块的命令 45 if hasattr(server,cmd): 46 func = getattr(server,cmd) 47 func(client_socket, client_user, ret_client_data) 48 else: 49 logger.error("command {0} not found".format(cmd)) 50 except Exception as e: 51 logger.error(e) 52 client_socket.close() 53 54 except Exception as e: 55 logger.error(e) 56 57 def process(): 58 """ 59 启动服务 60 :return: 61 """ 62 server = socketserver.ThreadingTCPServer((settings.FTP_SERVER_IP,settings.FTP_SERVER_PORT),MyServer) 63 server.serve_forever()