一、程序说明

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("", encoding='utf-8')) #发送通知客户端,该文件已存在
is_continue = str(conn.recv(1024), encoding='utf-8') #等待客户端选择回复
if is_continue == "":
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("", 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 == "":
inp = input("文件已存在,是否续传?Y/N:").strip()
if inp.upper() == 'Y':
ck.sendall(bytes("", 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("", 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("文件上传成功!")

python--简单的文件断点续传实例的更多相关文章

  1. Python读写Excel文件的实例

    最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理.首先贴出网上找来的读写Excel的脚本. 1.读取Excel(需要安装xlrd) ...

  2. python 简单实现文件拷贝

    1.背景 一日加班需要写一个文件拷贝的函数. 写了几版拷贝函数,有需要的直接粘贴过去 def CopyLocaleFile1(sorfile,desfile): #第一版 sorfp=open(sor ...

  3. Python 简单的文件上传功能

    简单地在程序当前目录下上传一张图片: 1.png 到程序的 yuan 文件夹下.这里使用的是固定参数 post,如果后期有需求,可以增加判断来更加完善程序. # server 端 import soc ...

  4. C#中简单的文件操作实例

    using System; using System.IO; namespace Demo { class Program { static string tmpPath = @"D:/Lg ...

  5. Python 简单批量请求接口实例

    #coding:utf-8 ''' Created on 2017年11月10日 @author: li.liu ''' import urllib import time str1=''' http ...

  6. 【python-ini】python读写ini文件

    [python-ini]python读写ini文件 本文实例讲述了Python读写ini文件的方法.分享给大家供大家参考.具体如下: 比如有一个文件update.ini,里面有这些内容:   1 2 ...

  7. python操作xml文件

    一.什么是xml? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. abc.xml <?xml version="1.0&q ...

  8. 服务器文档下载zip格式 SQL Server SQL分页查询 C#过滤html标签 EF 延时加载与死锁 在JS方法中返回多个值的三种方法(转载) IEnumerable,ICollection,IList接口问题 不吹不擂,你想要的Python面试都在这里了【315+道题】 基于mvc三层架构和ajax技术实现最简单的文件上传 事件管理

    服务器文档下载zip格式   刚好这次项目中遇到了这个东西,就来弄一下,挺简单的,但是前台调用的时候弄错了,浪费了大半天的时间,本人也是菜鸟一枚.开始吧.(MVC的) @using Rattan.Co ...

  9. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...

随机推荐

  1. 【转帖】普通程序员如何转向AI方向

    普通程序员如何转向AI方向 https://www.cnblogs.com/subconscious/p/6240151.html 眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智 ...

  2. [转帖]Linux crontab 查看所有用户的crontab任务

    Linux crontab 查看所有用户的crontab任务 https://www.cnblogs.com/xzlive/p/11542176.html 查看所有用户的crontab任务 - mlz ...

  3. springboot处理date参数

    前言 最近在后台开发中遇到了时间参数的坑,就单独把这个问题提出来找时间整理了一下: 正文 测试方法 bean代码: public class DateModelNoAnnotation { priva ...

  4. NP完全问题的证明

    目录 NP完全问题的证明 一.限制法 最小覆盖问题(VC) 子图同构问题 0-1背包(Knapsack) 三元集合的恰当覆盖(X3C) 集中集 有界度的生成树 多处理机调度 二.局部替换法 3SAT问 ...

  5. 关于win server中 task Scheduler使用

    日常开发过程中最会遇到很多定时任务,利用计算机自带的软件工具,既方便,又快捷,能节省大量的开发时间,而且功能全面,容错率高. 下面举个例子:定时发送邮件,每天8:10准时触发邮件发送脚本 1.首先配置 ...

  6. docker搭建elasticsearch、kibana,并集成至spring boot

    步骤如下: 一.基于docker搭建elasticsearch环境 1.拉取镜像 docker pull elasticsearch5.6.8 2.制作elasticsearch的配置文件 maste ...

  7. HDU2577 How to Type

    题目链接 一道DP问题 定义dp[i][j]为敲完第i个字母的最小花费,j=1代表Caps Lock打开,j=0代表Caps Lock关闭,则有: 如果第i个字母为大写: dp[i][1]=min(d ...

  8. Linux应急响应姿势浅谈

    一.前记 无论是甲方还是乙方的同学,应急响应可能都是家常便饭,你可能经常收到如下反馈: 运维同事 --> 服务器上存在可疑进程,系统资源占用高: 网络同事 --> 监控发现某台服务器对外大 ...

  9. k8s的node节点无法调度的问题

    1.现象,创建deployment时 2.查看污点 [fedora@k8s-cluster--ycmwlao4q5wz-master- ~]$ kubectl describe node k8s-cl ...

  10. TensorFlow NMT的词嵌入(Word Embeddings)

    本文转载自:http://blog.stupidme.me/2018/08/05/tensorflow-nmt-word-embeddings/,本站转载出于传递更多信息之目的,版权归原作者或者来源机 ...