python 客户端 版本更新_项目: 更新(二) python 实现大概FTP的功能

1 importsocketserver2 importstruct3 importpickle4 importos5

6

7 classMyserver(socketserver.BaseRequestHandler):8 def __init__(self, request, client_address, server):9 self.dic_cho ={10 'login': self.login, #登录

11 'register': self.register, #注册

12 'new_file': self.new_file, #创建新的文件夹

13 'down_dir': self.down_dir, #进入下一层

14 'up_dir': self.up_dir, #进入上一层

15 'upload': self.upload, #上传

16 'download': self.download, #下载

17 'vip': self.vip, #升级vip

18 'end': self.end, #结束

19 'size': 102400

20 }21 self.flag =False22 self.flag_end =True23 super().__init__(request, client_address, server)24

25 def my_reve(self): #因为每次接收后的内容都会转成字典, 所以重写了接收的函数

26 return pickle.loads(self.request.recv(struct.unpack('i', self.request.recv(4))[0]))27

28 def my_send(self, dic): #重写了 发送方法.

29 dic_pic =pickle.dumps(dic)30 return self.request.send(struct.pack('i', len(dic_pic)) +dic_pic)31

32 defisvip(self, server_dict, client_dic):33 """此函数是 login函数的附属函数, 只是用来判断该用户是否为Vip34

35 :param server_dict: 服务器需要发送的字典36 :param client_dic: 服务器接收的客户端发来的字典37 :return: None38 """

39 with open('vipinfo', encoding='utf-8') as f:40 for name inf:41 if client_dic['username'] ==name.strip():42 self.flag =True43 server_dict['return'] = '登录成功, 欢迎尊敬的VIP用户:\033[1;33;m%s\033[0m 访问ftp' % client_dic['username']44 self.dic_cho['size'] = 10240000

45 server_dict['size'] = '容量:(单位:字节)%s/10240000' %os.path.getsize(self.dir_path)46 return

47

48 deflogin(self, client_dic, server_dict):49 self.dir_path = os.path.join(os.path.dirname(__file__), client_dic['username'])50 #第一步 判断用户名+密码 是否正确

51 with open('info', encoding='utf-8') as f:52 for line inf:53 if client_dic['username'] + '\t' + client_dic['password'] ==line.strip():54 server_dict['return'] = '登录成功, 欢迎%s 用户访问ftp' % client_dic['username']55 server_dict['size'] = f'容量:(单位:字节){os.path.getsize(self.dir_path)}/102400'

56 server_dict['dir_list'] =os.listdir(self.dir_path)57 #第二步 判断此人是不是会员, 有没有vip文件中

58 self.isvip(server_dict, client_dic)59 #第三步, 将字典发送给 客户端并且 结束函数

60 self.my_send(server_dict)61 return

62 server_dict['return'] = '错误:输入错误'

63 self.my_send(server_dict)64

65 defregister(self, client_dic, server_dict):66 self.dir_path = os.path.join(os.path.dirname(__file__), client_dic['username'])67 with open('info', encoding='utf-8') as f:68 for line inf:69 username, password = line.strip().split('\t')70 if client_dic['username'] ==username:71 server_dict['return'] = '错误:用户名已存在'

72 self.my_send(server_dict)73 return

74 with open('info', 'a+', encoding='utf-8') as f:75 f.write(client_dic['username'] + '\t' + client_dic['password'] + '\n')76 self.flag =True77 server_dict['return'] = '注册成功,自动登录中'

78 os.mkdir(client_dic['username'])79 server_dict['dir_list'] =os.listdir(self.dir_path)80 server_dict['size'] = f'容量:(单位:字节){os.path.getsize(self.dir_path)}/102400'

81 self.my_send(server_dict)82

83 defnew_file(self, client_dic, server_dict):84 """

85 此函数和下面的六个函数 被执行的前提是客户已经登录成功了,86 且已经在客户端显示出来了文件列表, 若没有登录, 该用户访问不到此方法87

88 此函数的功能是 在当前工作列表中新建文件夹89 :param client_dic:90 :param server_dict:91 :return:92 """

93 new_name = client_dic['new_dir_name']94 os.mkdir(os.path.join(self.dir_path, new_name))95 server_dict['return'] = '%s 文件夹新建成功' %new_name96 self.my_send(server_dict)97

98 defdown_dir(self, client_dic, server_dict):99 down_dir_name = client_dic['down_dir_name']100 self.dir_path =os.path.join(self.dir_path, down_dir_name)101 server_dict['dir_list'] =os.listdir(self.dir_path)102 self.my_send(server_dict)103

104 defup_dir(self, client_dic, server_dict):105 dir_path_if =os.path.dirname(self.dir_path)106 if dir_path_if == os.path.dirname(__file__):107 server_dict['return'] = '已经是最上层目录了'

108 else:109 self.dir_path =dir_path_if110 server_dict['dir_list'] =os.listdir(self.dir_path)111 self.my_send(server_dict)112

113 defupload(self, client_dic, server_dict):114 filesize = client_dic['upload_file_size']115 size =os.path.getsize(self.dir_path)116 if filesize+size >= self.dic_cho['size']:117 server_dict['return'] = '内存不足'

118 self.my_send(server_dict)119 return

120 filename = os.path.join(self.dir_path, client_dic['upload_file_name'])121 with open(filename, 'wb') as f:122 whilefilesize:123 if filesize < 1024:124 content =self.request.recv(filesize)125 else:126 content = self.request.recv(1024)127 f.write(content)128 filesize -=len(content)129 server_dict['return'] = '上传成功'

130 server_dict['dir_list'] =os.listdir(self.dir_path)131 self.my_send(server_dict)132

133 defdownload(self, client_dic, server_dict):134 filename = os.path.join(self.dir_path, client_dic['download_file_name'])135 filesize =os.path.getsize(filename)136 server_dict['file_size'] =filesize137 self.my_send(server_dict)138 with open(filename, 'rb') as f:139 whilefilesize:140 if filesize > 1024:141 content =f.read(filesize)142 else:143 content = f.read(1024)144 self.request.send(content)145 filesize -=len(content)146 ok = self.request.recv(2)147 print(ok)148 self.request.send(b'download ok') if ok == b'ok' else self.request.send(b'download no')149

150 defvip(self, client_dic, server_dict):151 with open('vipinfo', 'r+', encoding='utf-8') as f:152 for line inf:153 if client_dic['username'] ==line.strip():154 server_dict['return'] = '您已经是尊敬的Vip用户了'

155 self.my_send(server_dict)156 return

157 f.seek(0, 2)158 f.write(client_dic['username'] + '\n')159 self.isvip(server_dict, client_dic)160 self.my_send(server_dict)161

162 defend(self, client_dic, server_dict):163 self.flag_end =False164 server_dict['return'] = '程序结束'

165 self.my_send(server_dict)166

167 defhandle(self):168 server_dict ={}169 flag =self.flag_end170 whileflag:171 try:172 client_dic =self.my_reve()173 self.dic_cho[client_dic['opt']](client_dic, server_dict)174 except Exception:pass

175

176

177 server = socketserver.TCPServer(('127.0.0.1', 9090), Myserver)178 server.serve_forever()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值