重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
一、Socketserver实现FTP,文件上传、下载
创新互联建站企业建站,10多年网站建设经验,专注于网站建设技术,精于网页设计,有多年建站和网站代运营经验,设计师为客户打造网络企业风格,提供周到的建站售前咨询和贴心的售后服务。对于成都网站建设、成都网站制作中不同领域进行深入了解和探索,创新互联在网站建设中充分了解客户行业的需求,以灵动的思维在网页中充分展现,通过对客户行业精准市场调研,为客户提供的解决方案。目录结构
1、socketserver实现ftp文件上传下载,可以同时多用户登录、上传、下载
效果图:
二、上面只演示了下载,上传也是一样的,来不及演示了,上代码
1、客户端
import socket,hashlib,os,json,sys,time class Ftpclient(object): def __init__(self): self.client = socket.socket() def connect(self,ip,port): self.client.connect((ip, port)) def help(self): msg=''' ls pwd cd .. get filename put filename ''' print(msg) def interactive(self): """ 客户端入口 :return: """ while True: verify = self.authenticate() #服务器端认证 if verify: while True: cmd = input('输入命令 >>').strip() if len(cmd) == 0:continue cmd_str = cmd.split()[0] if hasattr(self,'cmd_%s' %cmd_str): func = getattr(self,'cmd_%s' %cmd_str) func(cmd) else: self.help() def cmd_put(self,*args): """ 上传文件 :param args: :return: """ cmd_solit = args[0].split() start_time = self.alltime() # 开始时间 if len(cmd_solit) > 1: filename = cmd_solit[1] if os.path.isfile(filename): filesize = os.stat(filename).st_size msg_dic = { 'filename':filename, 'size':filesize, 'overridden':True, 'action':cmd_solit[0] } self.client.send( json.dumps(msg_dic).encode('utf-8')) server_respinse=self.client.recv(1024) #防止粘包,等服务器确认返回 print('文件开始上传',server_respinse) client_size = 0 f = open(filename,'rb') for line in f: client_size += self.client.send(line) self.processBar(client_size,filesize) #进度条 else: print('文件传输完毕,大小为 %s'%client_size) end_time = self.alltime() # 结束时间 print('本次上传花费了%s 秒'%self.alltime(end_time,start_time)) f.close() else: print(filename,'文件不存在') else: print('输入有误!') def cmd_get(self,*args): """ 下载文件 :param args: :return: """ cmd_solit = args[0].split() start_time = self.alltime() # 开始时间 filename = cmd_solit[1] if len(cmd_solit) > 1: msg_dic = { 'filename': filename, 'size': '', 'overridden': True, 'action': cmd_solit[0], 'file_exist':'' } self.client.send(json.dumps(msg_dic).encode('utf-8')) self.data = self.client.recv(1024).strip() cmd_dic = json.loads(self.data.decode('utf-8')) print(cmd_dic) if cmd_dic['file_exist']: if os.path.isfile(filename): f = open(filename + '.new', 'wb') else: f = open(filename, 'wb') self.client.send(b'200 ok') #防止粘包,等服务器确认返回 client_size = 0 filesize = cmd_dic['size'] m = hashlib.md5() while client_size < filesize: data=self.client.recv(1024) f.write(data) client_size +=len(data) m.update(data) self.processBar(client_size, filesize) else: print('下载完毕') end_time = self.alltime() # 结束时间 print('本次下载花费了%s 秒' % self.alltime(end_time, start_time)) f.close() new_file_md5 = m.hexdigest() server_file_md5 = self.client.recv(1024) print('MD5', server_file_md5,new_file_md5) else: print('下载的 %s文件不存在'%filename) else: print('输入有误!') def cmd_dir(self,*arge): cmd_solit = arge[0].split() if len(cmd_solit) > 0: msg_dic = { 'action': cmd_solit[0] } self.client.send(json.dumps(msg_dic).encode()) cmd_dir = self.client.recv(1024) print(cmd_dir.decode()) else: print('输入错误!') def alltime(self,*args): """ 计算上传、下载时间 :param args: :return: """ if args: return round(args[0] - args[1]) else: return time.time() def processBar(self,num, total): """ 进度条 :param num:文件总大小 :param total: 已存入文件大小 :return: """ rate = num / total rate_num = int(rate * 100) if rate_num == 100: r = '\r%s>%d%%\n' % ('=' * int(rate_num /3), rate_num,) else: r = '\r%s>%d%%' % ('=' * int(rate_num /3), rate_num,) sys.stdout.write(r) sys.stdout.flush def authenticate(self): """ 用户加密认证 :return: """ username = input('输入用户名:>>') password = input('输入密码:>>') m = hashlib.md5() if len(username) > 0 and len(password) >0: username = ''.join(username.split()) password = ''.join(password.split()) m.update(username.encode('utf-8')) m.update(password.encode('utf-8')) m = { 'username':username, 'password':password, 'md5':m.hexdigest() } self.client.send(json.dumps(m).encode('utf-8')) server_user_md5 = self.client.recv(1024).strip() print(server_user_md5.decode()) if server_user_md5.decode() == 'success': print('登录成功!') return 'ok' else: print('用户名密码错误!') else: print('请输入用户名密码') f = Ftpclient() f.connect('localhost',9999) f.interactive()
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。