国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python3實現ftp服務功能(客戶端)

2019-11-25 16:17:25
字體:
來源:轉載
供稿:網友

本文實例為大家分享了python3實現ftp服務功能的具體代碼,供大家參考,具體內容如下

客戶端 main代碼:

#Author by Andy#_*_ coding:utf-8 _*_'''This program is used to create a ftp client'''import socket,os,json,time,hashlib,sysclass Ftp_client(object): def __init__(self):  self.client = socket.socket() def help(self):  msg = '''useage:  ls  pwd  cd dir(example: / .. . /var)  put filename  rm filename  get filename  mkdir directory name  '''  print(msg) def connect(self,addr,port):  self.client.connect((addr,port)) def auth(self):  m = hashlib.md5()  username = input("請輸入用戶名:").strip()  m.update(input("請輸入密碼:").strip().encode())  password = m.hexdigest()  user_info = {   'action':'auth',   'username':username,   'password':password}  self.client.send(json.dumps(user_info).encode('utf-8'))  server_response = self.client.recv(1024).decode()  # print(server_response)  return server_response def interactive(self):  while True:   msg = input(">>>:").strip()   if not msg:    print("不能發送空內容!")    continue   cmd = msg.split()[0]   if hasattr(self,cmd):    func = getattr(self,cmd)    func(msg)   else:    self.help()    continue def put(self,*args):  cmd_split = args[0].split()  if len(cmd_split) > 1:   filename = cmd_split[1]   if os.path.isfile(filename):    filesize = os.stat(filename).st_size    file_info = {     "action":"put",     "filename":filename,     "size":filesize,     "overriding":'True'    }    self.client.send( json.dumps(file_info).encode('utf-8') )    #防止粘包,等待服務器確認。    request_code = {     '200': 'Ready to recceive data!',     '210': 'Not ready to received data!'    }    server_response = self.client.recv(1024).decode()    if server_response == '200':     f = open(filename,"rb")     send_size = 0     start_time = time.time()     for line in f:      self.client.send(line)      send_size += len(line)      send_percentage = int((send_size / filesize) * 100)      while True:       progress = ('/r已上傳%sMB(%s%%)' % (round(send_size / 102400, 2), send_percentage)).encode(        'utf-8')       os.write(1, progress)       sys.stdout.flush()       time.sleep(0.0001)       break     else:      end_time = time.time()      time_use = int(end_time - start_time)      print("/nFile %s has been sent successfully!" % filename)      print('/n平均下載速度%s MB/s' % (round(round(send_size / 102400, 2) / time_use, 2)))      f.close()    else:     print("Sever isn't ready to receive data!")     time.sleep(10)     start_time = time.time()     f = open(filename, "rb")     send_size = 0     for line in f:       self.client.send(line)       send_size += len(line)       # print(send_size)       while True:        send_percentage = int((send_size / filesize) * 100)        progress = ('/r已上傳%sMB(%s%%)' % (round(send_size / 102400, 2), send_percentage)).encode(         'utf-8')        os.write(1, progress)        sys.stdout.flush()        # time.sleep(0.0001)        break     else:      end_time = time.time()      time_use = int(end_time - start_time)      print("File %s has been sent successfully!" % filename)      print('/n平均下載速度%s MB/s' % (round(round(send_size / 102400, 2) / time_use, 2)))      f.close()   else:    print("File %s is not exit!" %filename)  else:   self.help() def ls(self,*args):  cmd_split = args[0].split()  # print(cmd_split)  if len(cmd_split) > 1:   path = cmd_split[1]  elif len(cmd_split) == 1:   path = '.'  request_info = {   'action': 'ls',   'path': path  }  self.client.send(json.dumps(request_info).encode('utf-8'))  sever_response = self.client.recv(1024).decode()  print(sever_response) def pwd(self,*args):  cmd_split = args[0].split()  if len(cmd_split) == 1:   request_info = {    'action': 'pwd',   }   self.client.send(json.dumps(request_info).encode("utf-8"))   server_response = self.client.recv(1024).decode()   print(server_response)  else:   self.help() def get(self,*args):  cmd_split = args[0].split()  if len(cmd_split) > 1:   filename = cmd_split[1]   file_info = {     "action": "get",     "filename": filename,     "overriding": 'True'    }   self.client.send(json.dumps(file_info).encode('utf-8'))   server_response = self.client.recv(1024).decode() #服務器反饋文件是否存在   self.client.send('0'.encode('utf-8'))   if server_response == '0':    file_size = int(self.client.recv(1024).decode())    # print(file_size)    self.client.send('0'.encode('utf-8')) #確認開始傳輸數據    if os.path.isfile(filename):     filename = filename+'.new'    f = open(filename,'wb')    receive_size = 0    m = hashlib.md5()    start_time = time.time()    while receive_size < file_size:     if file_size - receive_size > 1024: # 還需接收不止1次      size = 1024     else:      size = file_size - receive_size     data = self.client.recv(size)     m.update(data)     receive_size += len(data)     data_percent=int((receive_size / file_size) * 100)     f.write(data)     progress = ('/r已下載%sMB(%s%%)' %(round(receive_size/102400,2),data_percent)).encode('utf-8')     os.write(1,progress)     sys.stdout.flush()     time.sleep(0.0001)    else:     end_time = time.time()     time_use = int(end_time - start_time)     print('/n平均下載速度%s MB/s'%(round(round(receive_size/102400,2)/time_use,2)))     Md5_server = self.client.recv(1024).decode()     Md5_client = m.hexdigest()     print('文件校驗中,請稍候...')     time.sleep(0.3)     if Md5_server == Md5_client:      print('文件正常。')     else:      print('文件與服務器MD5值不符,請確認!')   else:    print('File not found!')    client.interactive()  else:   self.help() def rm(self,*args):  cmd_split = args[0].split()  if len(cmd_split) > 1:   filename = cmd_split[1]   request_info = {    'action':'rm',    'filename': filename,    'prompt':'Y'   }   self.client.send(json.dumps(request_info).encode("utf-8"))   server_response = self.client.recv(10240).decode()   request_code = {    '0':'confirm to deleted',    '1':'cancel to deleted'   }   if server_response == '0':    confirm = input("請確認是否真的刪除該文件:")    if confirm == 'Y' or confirm == 'y':     self.client.send('0'.encode("utf-8"))     print(self.client.recv(1024).decode())    else:     self.client.send('1'.encode("utf-8"))     print(self.client.recv(1024).decode())   else:    print('File not found!')    client.interactive()  else:   self.help() def cd(self,*args):  cmd_split = args[0].split()  if len(cmd_split) > 1:   path = cmd_split[1]  elif len(cmd_split) == 1:   path = '.'  request_info = {   'action':'cd',   'path':path  }  self.client.send(json.dumps(request_info).encode("utf-8"))  server_response = self.client.recv(10240).decode()  print(server_response) def mkdir(self,*args):  request_code = {   '0': 'Directory has been made!',   '1': 'Directory is aleady exist!'  }  cmd_split = args[0].split()  if len(cmd_split) > 1:   dir_name = cmd_split[1]   request_info = {    'action':'mkdir',    'dir_name': dir_name   }   self.client.send(json.dumps(request_info).encode("utf-8"))   server_response = self.client.recv(1024).decode()   if server_response == '0':    print('Directory has been made!')   else:    print('Directory is aleady exist!')  else:   self.help() # def touch(self,*args):def run(): client = Ftp_client() # client.connect('10.1.2.3',6969) Addr = input("請輸入服務器IP:").strip() Port = int(input("請輸入端口號:").strip()) client.connect(Addr,Port) while True:  if client.auth() == '0':   print("Welcome.....")   client.interactive()   break  else:   print("用戶名或密碼錯誤!")   continue

目錄結構:

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 马公市| 华亭县| 昌吉市| 松桃| 察哈| 民勤县| 福鼎市| 铁岭市| 凤翔县| 厦门市| 舟山市| 崇明县| 泗洪县| 辽宁省| 和龙市| 安达市| 怀仁县| 九龙县| 太康县| 土默特左旗| 夹江县| 普格县| 阳城县| 大石桥市| 旺苍县| 新泰市| 临湘市| 江孜县| 潞西市| 北碚区| 华容县| 新营市| 克拉玛依市| 南宫市| 平乡县| 沧州市| 读书| 东丽区| 阿合奇县| 陆河县| 商水县|