使用TFTP协议(Trivial File Transfer Protocol,简单文件传输协议)下载服务器指定文件夹内的图片

from socket import *  # 若import socket,后续写法为socket.socket()、socket.gethostname()
import struct  # struct模块可以按照指定格式将Python数据转换为字符串,该字符串为字节流
# TFTP(Trivial File Transfer Protocol,简单文件传输协议),使用这个协议,就可以实现简单文件的下载,tftp端口号为69。
from icecream import ic
import os
import randomos.chdir(r'D:\百战python\Python网络与并发编程——网络\tftp模拟下载的图片')  # 指定路径
path = os.getcwd()
ic(path)
file_list = os.listdir(path)  # listdir(path),返回 path 目录下的文件名。
ic(file_list)
filename = random.choice(file_list)  # 随机抽取即将下载的文件名。常见的图片格式都是可以的
ic(filename)
ic(gethostname())  # 获取本地主机名
ic(gethostbyname('mac-PC'))  # 获取本地IP地址
ic(gethostbyname(gethostname()))  # 获取本地IP地址
server_ip = gethostbyname(gethostname())  # 服务器的IP地址(此处下载文件在本机,故填写本机IP地址)
ic(server_ip)
send_data = struct.pack('!H%dsb5sb' % len(filename), 1, filename.encode(), 0, 'octet'.encode(), 0)  # 构造下载请求
# 用pack()方法,将'1Python.png0octet0'整合成字节流的数据包
# ! 表示按照网络传输数据要求的形式来组织数据(占位的格式)
# H 表示将后面的1替换成占两个字节
# 5s 相当于5个s(sssss)占5个字节
# b 占一个字节
s = socket(AF_INET, SOCK_DGRAM)  # 采用IPV4,UDP协议创建套接字对象
s.sendto(send_data, (server_ip, 69))  # 通过套接字对象把数据包发送到服务器的69号端口。服务器的69端口只用来接收读写请求
f = open(r'C:/Users/mac/PycharmProjects/pythonProject/myproject01/venv/第三章网络/{}'.format(filename), 'ab')  # 创建一个与下载的文件同名的空文件
n = 1
while True:  # 创建循环体,接收TFTP服务器返回的数据包receive_data = s.recvfrom(1024)  # 接收数据if n == 1:ic(receive_data)operation_code, block_num = struct.unpack('!HH', receive_data[0][:4])  # operation code操作码,block_num块编号# 以HH两个字节为一组的方式解析字节流rand_port = receive_data[1][1]  # 获取服务器的随机端口print(operation_code, block_num, rand_port, len(receive_data), len(receive_data[0]))if int(operation_code) == 5:  # 操作码若为5,则表示错误,停止接收,跳出循环体print('文件不存在')breakf.write(receive_data[0][4:])  # 写入数据if len(receive_data[0]) < 516:  # 若数据包长度小于516,说明数据下载完成ic(receive_data)print(f'数据接收{n}次,完成下载,文件的字节数为{514*(n-1)+len(receive_data[0])-2}')  # 程序接收过程不止咱们提到的这些信息,他还包括字节流顺序等等一些信息ic(os.path.getsize(filename))  # 传输过程的大小不能作为文件大小,实际获取用os模块breakack_data = struct.pack('!HH', 4, block_num)  # 发送确认包的格式为HH(两个字节为一组)。4表示确认包的操作码。收到了发送的第block_num块数据s.sendto(ack_data, (server_ip, rand_port))  # 回复确认包n += 1

运行结果:


TFTP协议下载服务器指定文件夹内的图片相关推荐

  1. php下载图片保存到临时文件夹,57、PHP将上传到临时文件夹的文件移动到服务器指定文件夹内...

    本节用到的文件操作函数: 1.is_uploaded_file() 函数判断指定的文件是否是通过 HTTP POST 上传的. 2.move_uploaded_file() 函数将上传的文件移动到新位 ...

  2. 手机ftp服务器进入制定文件夹,ftp服务器 指定文件夹

    ftp服务器 指定文件夹 内容精选 换一换 本节介绍使用Data Studio时要遵循的安装和配置步骤,以及配置服务器以调试PL/SQL函数的步骤.本章包含如下几节内容:安装Data Studio配置 ...

  3. 自动导入指定文件夹内的文献到 Endnote 中

    简介 最近正着手写一篇综述文章,来整体把握下自己研究领域的历史.方法.最新进展与趋势.由于需要对相关文献进行搜集.阅读和分类.庄小编使用 EndNote 来进行管理文献. 在使用较长时间后,整理了几个 ...

  4. java文件名大小_java 比较指定文件夹内.txt文件名的大小

    我写了一个程序:每过一定时间向指定文件夹内写一个按时间命名的.txt文件现在想实现最新的txt文件和最原先的txt文件内容比对但是不知道如何获得这两个文家的内容.packagetest;import. ...

  5. php遍历文件夹下文件内容_PHP递归遍历指定文件夹内的文件实现方法

    今天早上在地铁上看了关于文件和文件夹的一章,正好最近刚搞懂linux的文件系统,觉得对文件属性的访问跟Shell命令很像,所以想晚上来实践一下. 发现php的文件夹函数好像没有提供遍历文件夹下的所有文 ...

  6. MATLAB 删除指定文件夹内的文件夹及多个子文件夹

    初入实验室,本科使用过一点matlab,遗忘的很快.索性用博客记录使用期间碰到的一些问题及解决方案. 文章目录 1. 问题来源 2. 代码 2.1. MATLAB Documentation - Ma ...

  7. 在reader中勾选pdf复选框_如何让文件夹内PDF图片显示图标

    原标题:如何让文件夹内PDF图片显示图标 电脑小知识,值得收藏 有些网友Win 7系统的64位版本安装了Adobe Reader软件之后,发现PDF文件在系统中无法显示缩略图,这样看起来不是很方便,每 ...

  8. NodeJS:将指定文件夹内所有文件重命名为英文

    在编程之前,一定要有一个信条:代码是为了减少工作量而生的,重复枯燥的工作是不能容忍的. 需求 我前天遇到了一个小问题,需求是这样的: 我需要一个文件夹里面的所有图片文件并上传到服务器上,但是朋友给我发 ...

  9. java 删除指定文件夹内所有文件

    该内容来自于:java 删除指定文件目录_IT_choshim的博客-CSDN博客_java删除指定文件 //删除文件夹     //param folderPath 文件夹完整绝对路径     pu ...

  10. 根据txt文件中保存的图片名字,移动指定文件夹里的图片到新的文件夹

    在将voc数据集转化为coco数据集时,需要把JPEGImages文件夹下的图片按照train.txt(val.txt)所保存的文件名转移到train(val)文件夹. import shutil i ...

最新文章

  1. 万变不离其中----SQL必记语法
  2. Boost.Geometry 结合 Boost.Graph,计算最短路线
  3. 华三云:不做开源的投机者
  4. 受困于敏捷开发的数据与架构?肿么办?
  5. ubuntu分辨率设置
  6. ACM基础——OJ上的Java代码提交规范
  7. 生活中的数学(为生活建模)(二)
  8. Python 集合 day3
  9. VBS中转换二进制数据为字符串常用办法
  10. at shutdown 不起作用_at胎是什么胎
  11. JAVA制作QQ空间点赞_利用Javascript实现QQ空间自动点赞
  12. 保护板测试仪上位机软件,蓄电池性能测试仪放电部分与上位机软件设计
  13. awesome-python(python集合框架)
  14. RPM 包的构建 - SPEC 基础知识
  15. 计算机毕业论文致谢信范文,计算机毕业论文致谢
  16. 示波器基本原理1:模拟示波器
  17. RROR: [XSIM 43-3238] Failed to link the design.
  18. 【STM32F407开发板用户手册】第7章 STM32F407下载和调试方法(IAR8)
  19. 如何搭建多功能会议室
  20. 运行错误:view size is not compatible with input tensor‘s size and stride (at least

热门文章

  1. spoon新手入门教程
  2. 雷达篇(二)线性调频信号公式推导及matlab仿真
  3. 1.如何判断正交表对错
  4. python秒网课_利用python完成大学刷课(从0到完成的思路)
  5. linux典型压缩包操作 tar打包、压缩与解压
  6. python下载docx模块_怎么下载python-docx模块
  7. 照片一寸改成二寸,并压缩体积KB的工具
  8. 斐讯路由刷华硕固件后指示灯颜色修改
  9. python:实现杨辉三角
  10. Android影院选座