十. 網絡編程(FTP案例 知識點)

一. FTP案例 (相關知識點)python

1.進度條json

print('86%',end='')
print('86%',end='')
# 86%86%
tup="當前進度條%s%%"%(90)
print(tup)
# 當前進度條90%
import  time
def bar(size,tup_size):
     val=int(size/tup_size*100)
     time.sleep(1)
     print('\r%s%%'%(val),end='')
for i in range(101):
    bar(i,100)
def bar(size, tup_size):
    val = int(size / tup_size * 100)
    time.sleep(1)
    print('\r%s%% %s' % (val,"#"*val), end='')
for i in range(101):
    bar(i, 100)
2.獲取文件大小 
import os
file=r'H:\python之路\day40\1\aa' path2=os.path.getsize(file)
path1=os.stat(file).st_size print(type(path2),path2)  # <class 'int'> 15
print(type(path1),path1)# <class 'int'> 15

print(os.path.basename(file))

aa=os.path.dirname(file)
print(aa)
 3.FTP斷點續傳
client
import
socket,json,hashlib,os cli=socket.socket() cli.connect(('192.168.59.1',8500)) # 對文件md5加密 def file_md5(file_path): obj=open(file_path,"rb") m=hashlib.md5() for line in obj: m.update(line) obj.close() return m.hexdigest() while True: cmd=input("請輸入命令:").strip() file_path=r'H:\python之路\day40\1\11.jpg' file_val_md5=file_md5(file_path) # 獲取文件名 file_name=os.path.basename(file_path) # 返回絕對路徑的文件名 print(file_name) # 文件小 file_size=os.stat(file_path).st_size print(file_size) # 自定義協議 cmd_dict={"cmd":'upload','filename': file_name,'flie_szie':file_size,"md5": file_val_md5} upload_cmd_bytes=json.dumps(cmd_dict).encode("utf-8") cli.sendall(upload_cmd_bytes) response=json.loads(cli.recv(8999).decode()) print(response) if response["code"]==1001: # 文件不存中能夠不 斷點傳輸 # # 經過迭代來發送數據 # with open(file_path, "rb") as f1: # for line in f1: # cli.sendall(line) f1=open(file_path,"rb") send_date = 0 while file_size>send_date: date=f1.read(1024) cli.sendall(date) send_date+=len(date) f1.close() print("上傳成功了哈哈哈哈") else: # 文件存中能夠 斷點傳輸 + 文件大小 exist_size=response.get("size") f=open(file_path,"rb") f.seek(exist_size) send_date= exist_size while send_date<file_size: date = f.read(1024) cli.sendall(date) send_date += len(date) f.close()
server

import
socketserver,json,os ip_port=('192.168.59.1',8500) import shutil class Myserver(socketserver.BaseRequestHandler): def handle(self): conn=self.request addr=self.client_address upload_bytes= conn.recv(2048).decode("utf-8") cmd_dict=json.loads(upload_bytes) # print(cmd_dict) {'cmd': 'upload', 'filename': 'aa', 'flie_szie': 15, 'md5': 'ef13d7ea0e497e494dec5ffddf4fff14'} file_md5=cmd_dict.get("md5") # 經過md5來 拼路徑 # print(file_md5) ef13d7ea0e497e494dec5ffddf4fff14 file_name = cmd_dict.get("filename") file_path = os.path.join('home', 'msg',file_name) file_md5_path=os.path.join('home','msg',file_md5) # print( file_md5_path) home\msg\ef13d7ea0e497e494dec5ffddf4fff14 file_size= cmd_dict.get("flie_szie") # 判斷文件石否存中 exist=os.path.exists( file_md5_path) if not exist : # 文件不存中能夠不 斷點傳輸 response={'code':1001} conn.sendall(json.dumps(response).encode("utf-8")) recv_size=0 f=open(file_md5_path,"wb") while recv_size<file_size: date=conn.recv(1024) f.write(date) # 寫到了內存 f.flush() # 刷到硬盤本地文件 recv_size+=len(date) # return f.close() # 更名字 os.rename()在py2會報錯 和這是相等的shutil.move() shutil.move(file_md5_path,file_path) else: # 文件存中能夠 斷點傳輸 + 文件大小 exist_size=os.stat( file_md5_path).st_size #獲取文件大小 字節的方式 等同於 exist_size=os.path.getsize(file_path) response = {'code': 1002,"size":exist_size} conn.sendall(json.dumps(response).encode("utf-8")) f = open(file_md5_path, "ab") recv_size = exist_size while recv_size<file_size: date = conn.recv(1024) f.write(date) # 寫到了內存 f.flush() # 刷到硬盤本地文件 recv_size += len(date) f.close() os.rename(file_md5_path,file_path) server=socketserver.ThreadingTCPServer(ip_port,Myserver) server.serve_forever()
相關文章
相關標籤/搜索