• 功能要求

1. 用户加密认证

2. 服务端采用 SocketServer实现,支持多客户端连接

3. 每个用户有自己的家目录且只能访问自己的家目录

4. 对用户进行磁盘配额、不同用户配额可不同

5. 用户可以登陆server后,可切换目录

6. 能查看当前目录下文件

7. 上传下载文件,保证文件一致性

8. 传输过程中实现进度条展示

9.用户可在自己家目录进行创建目录、文件、删除目录及文件

10.服务端可实现增加用户、删除用户

11.支持上传时断点续传

  • 应用知识点 

a) 类的应用

b) 函数的使用

c) 多进程

d) 反射

e)  socket、socketserver、hashlib、configparser、logging

f)  文件的读写

  • 开发环境
  1. python 3.6.1
  2. 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、思维导图

python【项目】:基于socket的FTP服务器

2、功能接口关系图

客户端:

python【项目】:基于socket的FTP服务器

服务端:

python【项目】:基于socket的FTP服务器

  • 关键代码段

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()
ftpserver

相关文章: