python多线程文件的数据续传_python文件断点续传

201610181557196870.jpg

码农公社 210.net.cn 210= 1024 10月24日一个重要的节日--码农(程序员)节

一、程序说明

1586002435157152.jpg

1、文件上传目标路径:home/file

2、目标文件:putfile.png

3、服务端代码:put_server.py

4、客户端代码:put_client.py

二、各部分代码

1、服务端代码:put_server.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

"""

实现文件断点续传的服务器端

"""

import socket

import os

BASE_DIR = os.path.dirname(os.path.dirname(__file__))

home = os.path.join(BASE_DIR, "home/file")

sk = socket.socket()

sk.bind(('127.0.0.1', 8001))

sk.listen(5)

while True:

print("Waiting....")

conn, addr = sk.accept()

conn.sendall(bytes('欢迎登录', encoding='utf-8'))

flag = True

while flag:

client_bytes = conn.recv(1024) #接收客户端发送过来的内容

client_str = str(client_bytes, encoding='utf-8') #将内容转换成字符串

# 将客户端发送过来的内容以"|"拆分为:命名方法,文件名,文件大小,目标路径

func, file_name, file_byte_size, targe_path = client_str.split('|', 3)

file_byte_size = int(file_byte_size)

path = os.path.join(home, file_name)

has_received = 0

#首先判断该路径下是否已存在文件

if os.path.exists(path):

conn.sendall(bytes("2003", encoding='utf-8')) #发送通知客户端,该文件已存在

is_continue = str(conn.recv(1024), encoding='utf-8') #等待客户端选择回复

if is_continue == "2004":

has_file_size = os.stat(path).st_size

conn.sendall(bytes(str(has_file_size), encoding='utf-8')) #将已接收的文件大小给客户端

has_received += has_file_size

f = open(path, 'ab')

else:

f = open(path, 'wb')

else:

conn.sendall(bytes("2002", encoding='utf-8'))

f = open(path, 'wb')

while has_received < file_byte_size:

try:

data = conn.recv(1024)

if not data:

raise Exception

except Exception:

flag = False

break

f.write(data)

has_received += len(data)

print("文件已接收完成!")

f.close()

2、客户端代码:put_client.py

#!/usr/bin/env python

# -*- coding:utf-8 -*-

"""

实现文件断点续传的客户端

"""

import socket

import sys

import re

import os

FILE_DIR = os.path.dirname(__file__)

ck = socket.socket()

ck.connect(('127.0.0.1', 8001))

print(str(ck.recv(1024), encoding='utf-8'))

#定义一个函数,计算进度条

def bar(num = 1, sum = 100):

rate = float(num) / float(sum)

rate_num = int(rate * 100)

temp = '\r%d %%' % (rate_num)

sys.stdout.write(temp)

while True:

inp = input('请输入(内容格式:post|文件路径 目标路径): \n >>> ').strip() #输入内容格式:命令|文件路径 目标路径

func, file_path =inp.split("|", 1) #将输入的内容拆分为两部分,方法名和路径

local_path, target_path = re.split("\s*", file_path, 1) #再将路径部分,通过正则表达式。以空格拆分为:文件路径和上传的目标路径

file_byte_size = os.stat(local_path).st_size #获取文件的大小

file_name = os.path.basename(local_path) #设置文件名

post_info = "post|%s|%s|%s" % (file_name, file_byte_size, target_path) #将发送的内容进行拼接

ck.sendall(bytes(post_info, encoding='utf-8')) #向服务器端发送内容

result_exist = str(ck.recv(1024), encoding='utf-8')

has_sent = 0

if result_exist == "2003":

inp = input("文件已存在,是否续传?Y/N:").strip()

if inp.upper() == 'Y':

ck.sendall(bytes("2004", encoding='utf-8'))

result_continue_pos = str(ck.recv(1024), encoding='utf-8') #已经传输了多少的文件内容

print(result_continue_pos)

has_sent = int(result_continue_pos)

else:

ck.sendall(bytes("2005", encoding='utf-8')) #发送2005代表不续传

file_obj = open(local_path, 'rb') #对文件进行读操作

file_obj.seek(has_sent) #调整指针

while has_sent < file_byte_size:

data = file_obj.read(1024)

ck.sendall(data)

has_sent += len(data)

bar(has_sent, file_byte_size) #进度条

file_obj.close()

print("文件上传成功!")

引自https://www.cnblogs.com/june-L/p/11773884.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值