热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:网络基础ftp任务(进度条计算文件大小断点续传搭建框架示例)

本文由编程笔记#小编为大家整理,主要介绍了网络基础ftp任务(进度条计算文件大小断点续传搭建框架示例)相关的知识,希望对你有一定的参考价值。一、网络基础
本文由编程笔记#小编为大家整理,主要介绍了网络基础ftp任务(进度条计算文件大小断点续传搭建框架示例)相关的知识,希望对你有一定的参考价值。


一、网络基础

1、端口,是什么?为什么要有端口?

  端口是为了将同一个电脑上的不同程序进行隔离。

  IP是找电脑;端口是找电脑上的应用程序;

  端口范围:1 – 65535 ;    1 - 1024 不要用  ;  一般程序员用8000、8001……

2、OSI  七层模型(记住哪七层)

  应用层,使用软件;                 打开软件或网站

       表示层,看到数据,如图片和视频;   生产原始数据

       会话层,保持登录或链接状态;       应用偷偷携带一点其他数据: 令牌 19rRNAwf8g

       传输层,TCP/UDP;                [TCP][原始数据|19rRNAwf8g]

       网络层,IP;                      【IP】【[TCP][原始数据|19rRNAwf8g]】

       数据链路层,MAC;                [MAC][ 【IP】【[TCP][原始数据|19rRNAwf8g]】]

       物理层,将数据转换成电信号发送;

3、TCP三次握手,四次挥手

  socket客户端向服务端发起连接请求:三次握手(只能先由客户端向服务端发起请求)

    client.connect((……))

              客户端                           服务端

              我能打你吗

                                                 来呀来呀

              好的,我这就来

              ----------------------------------------

              client.send(收发数据)

              收发数据                     收发数据

  客户端和服务端断开连接:四次挥手(客户端和服务端都可以主动断开连接)

    client.close() 或者 conn.close()

              ------------------------------------------------------------

              我要断开连接

                                          断开就断开,等我处理一些手头的事情

                                          ……

                                          我处理完了,断开吧

              拜拜

  补充:断开连接时,反应到代码上:抛出异常(windows)/发送空内容(linux和mac系统)

总结:必须了解网络相关知识。

二、FTP任务分析(进度条、计算文件大小、断点续传、搭建框架示例)

1、进度条(
移动到行首、print不换行end=””)


import time
def jdt(now,all): # 进度条函数
per = int(now / all * 100)
print(‘
%s %s%%‘ % (‘*‘*per , per) ,end=‘‘)
time.sleep(0.05)
for i in range(101):
jdt(i,100) # 执行进度条函数

2、计算文件大小

  之前我们学过一种计算文件大小的方式:os.path.getsize(file_path),现在再来学习一种方式:


import os
size1 = os.path.getsize(‘server.py‘)
size2 = os.stat(‘server.py‘).st_size
print(size1,size2) # 1844 1844

3、断点续传

  我们先来写一个断点续传(脚本主要实现了客户端向服务端上传文件,上传过程中中断的话,再次上传此文件时接着上次中断的地方继续上传)的简单示例,然后从中提取一些编程思想:


技术分享图片技术分享图片

import os
import json
import socketserver
import shutil
CODE
= {
1001:上传文件,从头开始上传
}
def upload(cmd_dict,conn,username):
"""
服务端完成上传文件(含断点续传)
:param cmd_dict:
:param conn:
:return:
"""
# 2. 获取文件信息
file_md5 = cmd_dict[md5]
file_name
= cmd_dict[file_name]
file_md5_path
= os.path.join(username, file_md5)
file_name_path
= os.path.join(username, file_name)
upload_file_size
= cmd_dict[size]
# 3. 判断文件是否存在
exist = os.path.exists(file_md5_path)
if not exist: # 不续传
# 3.1.1 可以开始上传了,我已经准备好。
respOnse= {code: 1001}
conn.sendall(json.dumps(response).encode(
utf-8))
# 3.1.2 接收上传的文件内容
f = open(file_md5_path, wb)
recv_size
= 0
while recv_size < upload_file_size:
data
= conn.recv(1024)
f.write(data)
f.flush()
recv_size
+= len(data)
return
f.close()
# 3.1.3 改名字
shutil.move(file_md5_path, file_name_path)
else: # 续传
# 3.2 续传+大小
exist_size = os.stat(file_md5_path).st_size
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 < upload_file_size:
data
= conn.recv(1024)
f.write(data)
f.flush()
recv_size
+= len(data)
f.close()
# 3.1.3 改名字
shutil.move(file_md5_path, file_name_path)
class NbServer(socketserver.BaseRequestHandler):
def handle(self):
"""
self.request 是客户端的socket对象
:return:
"""
# 1. 接收命令
upload_cmd_bytes = self.request.recv(8096)
cmd_dict
= json.loads(upload_cmd_bytes.decode(utf-8))
if cmd_dict[cmd] == upload:
upload(cmd_dict,self.request,
lili) # 服务端代码有个文件夹(lili)才能运行
elif cmd_dict[cmd] == download:
pass
if __name__ == __main__:
server
= socketserver.ThreadingTCPServer((127.0.0.1,8001),NbServer)
server.serve_forever()


服务端

技术分享图片技术分享图片

import os
import socket
import json
import hashlib
CODE
= {
1001:上传文件,从头开始上传
}
def file_md5(file_path):
"""
文件进行md5加密
:param file_path:
:return:
"""
obj
= open(file_path,rb)
m
= hashlib.md5()
for line in obj:
m.update(line)
obj.close()
return m.hexdigest()
def jdt(size,total_size):
"""
显示进度条
:return:
"""
val
= int(size / total_size * 100)
print(
%s%%|%s
% (val, "#" * val,), end=‘‘)
def send_file(exist_size,file_total_size):
"""
发送文件
:param exist_size:开始读取字节的位置
:param file_total_size: 文件总字节大小
:return:
"""
f
= open(file_path, rb)
f.seek(exist_size)
send_size
= exist_size
while send_size < file_total_size:
data
= f.read(1024)
sk.sendall(data)
send_size
+= len(data)
jdt(send_size,file_total_size)
f.close()
print(上传成功)
def upload(file_path):
"""
文件上传(含断点)
:param file_path:
:return:
"""
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)
# 2. 等待服务端的响应
respOnse= json.loads(sk.recv(8096).decode(utf-8))
if response[code] == 1001:
send_file(0, file_size)
else:
# 短点续传
exist_size = response[size]
send_file(exist_size,file_size)
sk
= socket.socket()
sk.connect((
127.0.0.1,8001))
while True:
# upload|文件路|径
user_input = input("请输入要执行的命令")
# 1. 自定义协议{‘cmd‘:‘upload‘,‘file_path‘:‘.....‘}
cmd,file_path = user_input.split(|,maxsplit=1)
if cmd == upload:
upload(file_path)
elif cmd == download:
pass


客户端

总结:

  1)CODE 自定义状态码;

       2)自定义规范: {‘code‘:1000 };

       3)if…else… 分支用 反射;

  4)其他:删除修改文件,如下示例:

 


import os
import shutil
# py2 + win:报错
os.rename(‘a.txt‘,‘b.txt‘)
# py2 + py3 都不会报错
shutil.move(‘c.txt‘,‘a.txt‘) # 若a.txt已经存在,则会将其覆盖掉
shutil.rmtree(‘E:@LilypythonDemoclassic‘) # 递归删除一个目录以及目录内的所有内容

  

4、搭建框架示例

# myProject/

   # ├── bin   (当前项目的启动脚本在这里)

   # │   ├── start.py
   # ├── core   (核心代码都在这里)
   # │   └── main.py
   # └── db
   #     └── userInfo.json

   # └── lib(不是内置和第三方模块,可能是自己写的,较完善且跟此程序相关性小)
   #     └── models.py

   # └── conf(配置文件,多处用到某个值以后可能会被修改,则写到配置文件中)
   #     └── settings.py

   # └── log(日志文件,供用户查看追责或者公司分析数据)
   #     └── all.log

        # ├── readme (对程序作说明,说明如何使用此程序)

 


推荐阅读
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • python3+tkinter实践历程(四)——模仿CRT完成基于socket通信与tkinter的TCP串口客户端
    python3tkinter实践历程(四)——基于socket通信与tkinter的TCP串口客户端(仿CRT)文章目录系列文章目录分享背景制作背景最终功能工具截图展示代码详解系列 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • python限制递归次数(python最大公约数递归)
    本文目录一览:1、python为什么要进行递归限制 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • Node.js学习笔记(一)package.json及cnpm
    本文介绍了Node.js中包的概念,以及如何使用包来统一管理具有相互依赖关系的模块。同时还介绍了NPM(Node Package Manager)的基本介绍和使用方法,以及如何通过NPM下载第三方模块。 ... [详细]
author-avatar
手机用户2502869943
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有