热门标签 | 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 (对程序作说明,说明如何使用此程序)

 


推荐阅读
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在CentOS 7环境中安装配置Redis及使用Redis Desktop Manager连接时的注意事项与技巧
    在 CentOS 7 环境中安装和配置 Redis 时,需要注意一些关键步骤和最佳实践。本文详细介绍了从安装 Redis 到配置其基本参数的全过程,并提供了使用 Redis Desktop Manager 连接 Redis 服务器的技巧和注意事项。此外,还探讨了如何优化性能和确保数据安全,帮助用户在生产环境中高效地管理和使用 Redis。 ... [详细]
  • 如何在PHP中准确获取服务器IP地址?
    如何在PHP中准确获取服务器IP地址? ... [详细]
  • 本文介绍了如何利用Shell脚本高效地部署MHA(MySQL High Availability)高可用集群。通过详细的脚本编写和配置示例,展示了自动化部署过程中的关键步骤和注意事项。该方法不仅简化了集群的部署流程,还提高了系统的稳定性和可用性。 ... [详细]
  • 在Cisco IOS XR系统中,存在提供服务的服务器和使用这些服务的客户端。本文深入探讨了进程与线程状态转换机制,分析了其在系统性能优化中的关键作用,并提出了改进措施,以提高系统的响应速度和资源利用率。通过详细研究状态转换的各个环节,本文为开发人员和系统管理员提供了实用的指导,旨在提升整体系统效率和稳定性。 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 利用 Python Socket 实现 ICMP 协议下的网络通信
    在计算机网络课程的2.1实验中,学生需要通过Python Socket编程实现一种基于ICMP协议的网络通信功能。与操作系统自带的Ping命令类似,该实验要求学生开发一个简化的、非标准的ICMP通信程序,以加深对ICMP协议及其在网络通信中的应用的理解。通过这一实验,学生将掌握如何使用Python Socket库来构建和解析ICMP数据包,并实现基本的网络探测功能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 触发器的稳态数量分析及其应用价值
    本文对数据库中的SQL触发器进行了稳态数量的详细分析,探讨了其在实际应用中的重要价值。通过研究触发器在不同场景下的表现,揭示了其在数据完整性和业务逻辑自动化方面的关键作用。此外,还介绍了如何在Ubuntu 22.04环境下配置和使用触发器,以及在Tomcat和SQLite等平台上的具体实现方法。 ... [详细]
  • 数字图书馆近期展出了一批精选的Linux经典著作,这些书籍虽然部分较为陈旧,但依然具有重要的参考价值。如需转载相关内容,请务必注明来源:小文论坛(http://www.xiaowenbbs.com)。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 在《Cocos2d-x学习笔记:基础概念解析与内存管理机制深入探讨》中,详细介绍了Cocos2d-x的基础概念,并深入分析了其内存管理机制。特别是针对Boost库引入的智能指针管理方法进行了详细的讲解,例如在处理鱼的运动过程中,可以通过编写自定义函数来动态计算角度变化,利用CallFunc回调机制实现高效的游戏逻辑控制。此外,文章还探讨了如何通过智能指针优化资源管理和避免内存泄漏,为开发者提供了实用的编程技巧和最佳实践。 ... [详细]
  • 全面解析JavaScript代码注释技巧与标准规范
    在Web前端开发中,JavaScript代码的可读性和维护性至关重要。本文将详细介绍如何有效地使用注释来提高代码的可读性,并探讨JavaScript代码注释的最佳实践和标准规范。通过合理的注释,开发者可以更好地理解和维护复杂的代码逻辑,提升团队协作效率。 ... [详细]
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社区 版权所有