十. 网络编程(FTP案例 知识点)

一. FTP案例 (相关知识点)

1.进度条

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('
%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('
%s%% %s' % (val,"#"*val), end='')
for i in range(101):
    bar(i, 100)
2.获取文件大小 
import os
file=r'H:python之路day401aa'
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之路day40111.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) homemsgef13d7ea0e497e494dec5ffddf4fff14 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()



 

原文地址:https://www.cnblogs.com/Sup-to/p/11173984.html