文件传送/断点续传

import threading
def task():
pass
#创建一个线程
t = threading.Thread(target=task)
#执行
t.start()

#进度条
import time
def func(size,total_size):
val = int(size/total_size*100)
time.sleep(0.1)
print(’\r%s%%’ %val,end=’’)
for i in range(101):
func(i,100)

#断点续传
import os
import json
import socketserver
import shutil
class Myserver(socketserver,BaseRequestHandler):
def handle(self):
“”"
self.request 是客户端的socket对象
:return:
“”"
#接受命令
upload_cmd_bytes = self.request.recv(2048)
cmd_dict = json.loads(upload_cmd_bytes.decode(‘utf-8’))
#获取文件信息
file_name = cmd_dict[‘file_name’]
file_md5 = cmd_dict[‘md5’]
file_name_path = os.path.join(‘home’,file_name)
upload_file_size = cmd_dict[‘size’]
#判断文件是否存在
exist = os.path.exists(file_md5_path)
if not exist:#不续传
response = {‘code’:1001,}
self.requset.sendall(json.dumps(response).encode(‘utf-8’))
f = open(file_md5_path,‘wb’)
#接受上传的文件内容
recv_size = 0
while recv_size <upload_file_size:
data=self.request.recv(1024)
f.write(data)
f.flush()
recv_size+=len(data)
f.close()
#改名字
#os.rename()
shutil.move(file_md5_path,file_name_path)
else:#续传+大小
exist_size = os.stat(file_md5_path).st_size
response = {‘code’:1002,‘size’:exist_size}
self.requset.sendall(json.dumps(response).encode(‘utf-8’))
f = open(file_md5_path,‘ab’)
recv_size =exist_size
while recv_size <upload_file_size:
data=self.request.recv(1024)
f.write(data)
f.flush()
recv_size+=len(data)
f.close()
#改名字
#os.rename()
shutil.move(file_md5_path,file_name_path)

if name ==‘main’:
socketserver.ThreadingTCPServer((“IP”,8888),Myserver)
server.serve_forever()

#客户端
import socket
import json
import hashlib
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()
sk = socket.socket()
sk.connect((‘IP’,8888))
while 1:
cmd = input(“请输入执行的命令”)
“”"
1.自定义协议
{‘cmd’:‘upload’,‘file_path’:’…’}
“”"
file_path = ‘/…/’
file_md5_val = file_md5(file_path)
file_name = os.path.basename(file_path)
file_size = os.stat(file_path).st_size
cmd_dict= {‘cmd’:‘upload’,‘file_name’:file_name,‘size’:file_size,‘md5’:file_md5_val}
upload_cmd_bytes = json.dumps(cmd_dict).encode(‘utf-8’)
sk.sendall(upload_cmd_bytes)
#等待服务端的响应
response = json.loads(sk.recv(8096).decode(‘utf-8’))
if response[‘code’]==‘1001’:#从头开始
‘’’
with open(file_path,mode=‘rb’) as f:
for line in f:
sk.sendall(line)
‘’’
f=open(file_path,mode=‘rb’)
send_size = 0
while send_size<file_size:
data = f.read(1024)
sk.sendall(data)
send_size += len(data)
f.close()
else:#断点续传
exist_size = response[‘size’]
f = open(file_path,‘rb’)
f.seek(exist_size)
send_size = exist_size
while send_size<file_size:
data = f.read(1024)
sk.sendall(data)
send_size += len(data)
f.close()

#目录结构
bin
cinfig
core
db
log
readme

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值