首页 > 代码库 > 转载别人的ftp,觉得目录结构不错,学习

转载别人的ftp,觉得目录结构不错,学习

开发简单的FTP:
1. 用户登陆
2. 上传/下载文件
3. 不同用户家目录不同
4. 查看当前目录下文件
5. 充分使用面向对象知识

 

 

 REDMAE

 1 用户登陆
 2 
 3 1、查看用户目录文件
 4 2、上传文件,
 5 3、下载方件
 6 4、退出
 7 
 8 程序结构:
 9 socket_server_client/#程序目录
10 |- - -clients/#client程序主目录
11 |      |- - -__init__.py
12 |      |- - -bin/#启用目录
13 |      |       |- - - __init__.py
14 |      |       |- - -socket_client.py#客户端启动
15 |      |
16 |      |- - -cfg/#配置文件目录
17 |      |       |- - - __init__.py
18 |      |       |- - -config.py#配置文件
19 |      |
20 |      |- - -core/#主要程序目录
21 |      |       |- - - __init__.py
22 |      |       |- - -client_func.py#主要函数
23 |      |
24 |      |- - -home/#客户端下载文件目录
25 |
26 |- - -servers/#server程序主目录
27 |      |- - -__init__.py
28 |      |- - -bin/#启用目录
29 |      |       |- - - __init__.py
30 |      |       |- - -registration.py#用户注册
31 |      |       |- - -socket_server.py#服务端启动
32 
33 |      |
34 |      |- - -cfg/#配置文件目录
35 |      |       |- - - __init__.py
36 |      |       |- - -config.py#配置文件
37 |      |
38 |      |- - -core/#主要程序目录
39 |      |       |- - - __init__.py
40 |      |       |- - -server_classc.py#主要函数
41 |      |
42 |      |- - -db/#用户上传文件主目录
43 |              |- - -user_file/#用户上传目录
44 |              |- - -user_names#注册用户文件
45 |

 

服务端

servers/

    bin/

registration.py

技术分享
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import socket,os,json,sys,pickle
 5 
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 7 sys.path.append(BASE_DIR)#增加环境变量
 8 from cfg import config
 9 print(‘用户注册‘.center(60,‘=‘))
10 while True:
11     user_=input(‘请输入您要注册的用户名:‘).strip()
12     user_dir=os.path.join(config.USER_DIR,user_)#拼接用户目录路径
13     if os.path.isdir(user_dir):# 判断一个目录是否存在
14         print(‘用户已经存在请重输!‘)
15         continue
16     else:
17         pwd_=input(‘请输入密码:‘).strip()
18         pwd_two=input(‘请确认密码:‘).strip()
19         if pwd_==pwd_two:
20             try:
21                 os.mkdir(user_dir)#创建目录
22             except Exception as e:
23                 print(e)
24                 continue
25             finally:
26                 file_dir=user_dir+‘\\user‘#用户目录下的用户名文件
27             if  not os.path.isfile(config.USER_FILE):
28                 with open(config.USER_FILE,‘w‘,encoding=‘utf-8‘) as f:
29                     f.write(‘{}‘)
30             with open(config.USER_FILE,‘r+‘,encoding=‘utf-8‘) as f:
31                 data=http://www.mamicode.com/eval(f.readline())>

socket_server.py

 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import socket,os,json
 5 import sys
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 7 sys.path.append(BASE_DIR)#增加环境变量
 8 
 9 from  core.server_class import listen_func
10 s=socket.socket()#定义
11 s.bind((‘localhost‘,9000))#绑定要监听的 端口
12 s.listen(5)#对列5
13 print(‘正在监听中‘)
14 listen_func(s)

cfg/

config.py

技术分享
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import os ,sys
 5 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 6 sys.path.append(BASE_DIR)#增加环境变量
 7 
 8 
 9 USER_DIR=BASE_DIR+‘\db\\user_file\\‘#定义用户目录文件路径变量
10 
11 USER_FILE=BASE_DIR+‘\db\\user_names‘#定义用户文件路径变量

 

core/

server_class.py

技术分享
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 import socket,os,json,sys,pickle
  5 
  6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
  7 sys.path.append(BASE_DIR)#增加环境变量
  8 
  9 from cfg import config
 10 
 11 
 12 #用户名检测函数
 13 def open_file_list(name,pas):#传入当前类
 14     with open(config.USER_FILE,‘r‘,encoding=‘utf-8‘) as f:
 15         data=http://www.mamicode.com/eval(f.readline())"name"],self.DATA[‘pwd‘],self.conn)#用户名检测
 43         return ret
 44     def open_f(self,ret):#打开目录
 45         file_dir=os.path.join(socket_server.file_path,ret[‘data‘][‘user‘])#用户目录
 46         file_name=os.listdir(file_dir)#目录文件列表
 47         f=file_dir+self.DATA[‘filename‘]##上传的文件名
 48         return file_dir,file_name,f#返回
 49 
 50     def ls_file(self,data):#查看文件
 51         self.conn.send(json.dumps(data[1]).encode())
 52 
 53     def send_file(self,data):
 54 
 55         if self.DATA[‘filename‘] in data[1]:
 56             f=data[0]+‘/‘+self.DATA[‘filename‘]
 57             file_obj=open(f,"rb")#打开文件
 58             name=file_obj.name.split(‘/‘)[-1]#文件名
 59             sez=os.path.getsize(f)#获取文件大小
 60             print(sez)
 61             data_header={
 62                     "action":"put",
 63                     "filename":name,
 64                     "size":sez
 65                     }
 66             self.conn.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息
 67             for line in file_obj:
 68                 self.conn.send(line)#发送数据
 69 
 70         elif self.DATA[‘filename‘].isdigit():
 71             num=int(self.DATA[‘filename‘])#转为数字
 72             try:
 73                 f=data[0]+‘/‘+data[1][num]#
 74                 file_obj=open(f,"rb")#打开文件
 75                 name=file_obj.name.split(‘/‘)[-1]#文件名
 76                 sez=os.path.getsize(f)#获取文件大小
 77                 print(sez)
 78                 data_header={
 79                 "action":"put",
 80                 "filename":name,
 81                 "size":sez
 82                 }
 83                 self.conn.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息
 84                 for line in file_obj:
 85                     self.conn.send(line)#发送数据
 86                 self.conn.send(json.dumps(f).encode())#发送文件
 87             except Exception as e:
 88                 data=http://www.mamicode.com/{‘filename‘:False}"size"])
 97         #prten.__next__()
 98         while rece_size<self.DATA["size"]:#小于接收的文件大小时,
 99             recv_data=http://www.mamicode.com/self.conn.recv(4096)"文件[%s]接收完毕!"%self.DATA["filename"])
105             file_obj.flush()
106             file_obj.close()#关闭文件
107 
108 
109     @staticmethod
110     def login(name,pas,conn):#用户检测 函数
111         try:
112             if open_file_list(name,pas):
113                 tag=True
114                 error=‘‘
115                 datas={‘user‘:name}
116                 data=http://www.mamicode.com/{‘mag‘:‘用户认证通过‘,‘tag‘:True}"put":#如果接收的字典中是put,就是进行接收
151                 serv=socket_server(data,conn)
152                 serv.put_file(serv.open_f(ret))#调对象方法
153             elif data[‘action‘]==‘get‘:#下载
154                 serv=socket_server(data,conn)#实例化
155                 serv.send_file(serv.open_f(ret))#调 用方法
156             elif data[‘action‘]==‘ls‘:#查看
157                 serv=socket_server(data,conn)
158                 serv.ls_file(serv.open_f(ret))
159                 continue

 

 

客户端

clients/

bin/

socket_client.py

技术分享
  1 #!usr/bin/env python
  2 #-*-coding:utf-8-*-
  3 # Author calmyan
  4 
  5 import socket,os,json,sys
  6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
  7 sys.path.append(BASE_DIR)#增加环境变量
  8 from core.client_func import user_pwd
  9 #from core.client_func import show_process
 10 from cfg import config
 11 
 12 #进度条
 13 def show_process(lens):
 14     received_size=0#定义大小
 15     current_percent=0#当前大小百分比
 16     while received_size<lens:
 17         if int((received_size/lens)*100)>current_percent:
 18             print(‘#‘,end=‘‘,flush=True)
 19             current_percent=int((received_size/lens)*100)
 20         new_size=yield
 21         received_size+=new_size
 22 
 23 
 24 client=socket.socket()
 25 client.connect((‘localhost‘,9000))
 26 while True:
 27     data_d=user_pwd(client)
 28     if data_d[‘tag‘]:#运行#用户名登陆成功
 29         while True:
 30             print(‘‘‘=====指令提示====
 31             查看目录文件: ls
 32             下载文件: get 文件名 或 文件编号  如: get test.txt  或  get 1
 33             上传方件: put 路径/文件名 如 put e:/test.txt
 34             退出:exit
 35             ‘‘‘)
 36             cho=input(‘指令 >>:‘).strip()
 37             if len(cho)==0:continue
 38             if cho==‘exit‘:exit()#退出指令
 39             cmd_list=cho.split()
 40             if cmd_list[0]==‘put‘:#如果等于下载指令
 41                 if len(cmd_list)==1:
 42                     print(‘没有输入相关文件名‘)
 43                     continue
 44                 filename=cmd_list[1]
 45                 if os.path.isfile(filename):#如果文件存在
 46                     file_obj=open(filename,"rb")#打开文件
 47                     name=file_obj.name.split(‘/‘)[-1]#文件名
 48                     #name=filename.split("\\")[-1]#文件名
 49                     sez=os.path.getsize(filename)#获取文件大小
 50                     data_header={
 51                         "action":"put",
 52                         "filename":name,
 53                         "size":sez
 54                     }
 55                     client.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息
 56 
 57                     print("文件[%s]发送中...."%data_header["filename"])
 58                     for line in file_obj:
 59                         client.send(line)
 60                     else:
 61                         print("文件[%s]发送完毕!"%data_header["filename"])
 62                 else:
 63                     print(‘该文件不存在‘)
 64                     continue
 65             elif cmd_list[0]==‘get‘:#如查等 于上传指令
 66                 if len(cmd_list)==1:
 67                     print(‘没有输入相关文件名‘)
 68                     continue
 69                 filename=cmd_list[1]
 70                 print(filename)
 71                 data_header={
 72                         "action":"get",
 73                         "filename":filename,
 74                         "size":‘‘
 75                     }
 76                 client.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息
 77                 datas=client.recv(4096)#接收数据 指令
 78                 data_l= json.loads(datas.decode())#反序列
 79                 if  not data_l[‘filename‘]:
 80                     print(‘文件不存在‘)
 81                     continue
 82                 file_dir=config.USER_DIR+data_l["filename"]
 83                 file_obj=open(file_dir,‘wb‘)#打开新建 这个文件
 84                 rece_size=0#定义 文件大小值
 85                 prten=show_process(data_l["size"])
 86                 prten.__next__()
 87                 while rece_size<data_l["size"]:#小于接收的文件大小时,
 88                     recv_data=http://www.mamicode.com/client.recv(4096)"文件[%s]接收完毕!"%data_l["filename"])
 98                     file_obj.flush()
 99                     file_obj.close()#关闭文件
100             elif cmd_list[0]==‘ls‘:#查看目录文件
101                 data_header={
102                         "action":"ls",
103                         "filename":‘‘,
104                         "size":‘‘
105                     }
106                 client.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息
107                 datas=client.recv(4096)#接收数据 指令
108                 data_l= json.loads(datas.decode())#反序列
109                 for k,v in enumerate(data_l):
110                     print(‘编号: %s  文件名:%s‘%(k,v))
111 
112     else:
113         print(data_d[‘mag‘])

 

cfg/

config.py

 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 
 5 import os ,sys
 6 BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))#获取相对路径转为绝对路径赋于变量
 7 sys.path.append(BASE_DIR)#增加环境变量
 8 
 9 
10 USER_DIR=BASE_DIR+‘\home\\‘#定义用户目录文件路径变量

 

core/

client_func.py

技术分享
 1 #!usr/bin/env python
 2 #-*-coding:utf-8-*-
 3 # Author calmyan
 4 import socket,os,json,sys
 5 #用户名登陆函数
 6 def user_pwd(client):
 7     user_=input(‘请输入用户名:‘).strip()
 8     pwd_=input(‘请输入密码:‘).strip()
 9     data_header={
10                 "action":"user",
11                 "name":user_,
12                 "pwd":pwd_
13             }
14     client.send(json.dumps(data_header).encode())#用json 序列化后,发送相关 信息
15     data=http://www.mamicode.com/client.recv(4096)#接收数据 指令>

转载别人的ftp,觉得目录结构不错,学习