TFTP协议下载服务器指定文件夹内的图片
使用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协议下载服务器指定文件夹内的图片相关推荐
- php下载图片保存到临时文件夹,57、PHP将上传到临时文件夹的文件移动到服务器指定文件夹内...
本节用到的文件操作函数: 1.is_uploaded_file() 函数判断指定的文件是否是通过 HTTP POST 上传的. 2.move_uploaded_file() 函数将上传的文件移动到新位 ...
- 手机ftp服务器进入制定文件夹,ftp服务器 指定文件夹
ftp服务器 指定文件夹 内容精选 换一换 本节介绍使用Data Studio时要遵循的安装和配置步骤,以及配置服务器以调试PL/SQL函数的步骤.本章包含如下几节内容:安装Data Studio配置 ...
- 自动导入指定文件夹内的文献到 Endnote 中
简介 最近正着手写一篇综述文章,来整体把握下自己研究领域的历史.方法.最新进展与趋势.由于需要对相关文献进行搜集.阅读和分类.庄小编使用 EndNote 来进行管理文献. 在使用较长时间后,整理了几个 ...
- java文件名大小_java 比较指定文件夹内.txt文件名的大小
我写了一个程序:每过一定时间向指定文件夹内写一个按时间命名的.txt文件现在想实现最新的txt文件和最原先的txt文件内容比对但是不知道如何获得这两个文家的内容.packagetest;import. ...
- php遍历文件夹下文件内容_PHP递归遍历指定文件夹内的文件实现方法
今天早上在地铁上看了关于文件和文件夹的一章,正好最近刚搞懂linux的文件系统,觉得对文件属性的访问跟Shell命令很像,所以想晚上来实践一下. 发现php的文件夹函数好像没有提供遍历文件夹下的所有文 ...
- MATLAB 删除指定文件夹内的文件夹及多个子文件夹
初入实验室,本科使用过一点matlab,遗忘的很快.索性用博客记录使用期间碰到的一些问题及解决方案. 文章目录 1. 问题来源 2. 代码 2.1. MATLAB Documentation - Ma ...
- 在reader中勾选pdf复选框_如何让文件夹内PDF图片显示图标
原标题:如何让文件夹内PDF图片显示图标 电脑小知识,值得收藏 有些网友Win 7系统的64位版本安装了Adobe Reader软件之后,发现PDF文件在系统中无法显示缩略图,这样看起来不是很方便,每 ...
- NodeJS:将指定文件夹内所有文件重命名为英文
在编程之前,一定要有一个信条:代码是为了减少工作量而生的,重复枯燥的工作是不能容忍的. 需求 我前天遇到了一个小问题,需求是这样的: 我需要一个文件夹里面的所有图片文件并上传到服务器上,但是朋友给我发 ...
- java 删除指定文件夹内所有文件
该内容来自于:java 删除指定文件目录_IT_choshim的博客-CSDN博客_java删除指定文件 //删除文件夹 //param folderPath 文件夹完整绝对路径 pu ...
- 根据txt文件中保存的图片名字,移动指定文件夹里的图片到新的文件夹
在将voc数据集转化为coco数据集时,需要把JPEGImages文件夹下的图片按照train.txt(val.txt)所保存的文件名转移到train(val)文件夹. import shutil i ...
最新文章
- 万变不离其中----SQL必记语法
- Boost.Geometry 结合 Boost.Graph,计算最短路线
- 华三云:不做开源的投机者
- 受困于敏捷开发的数据与架构?肿么办?
- ubuntu分辨率设置
- ACM基础——OJ上的Java代码提交规范
- 生活中的数学(为生活建模)(二)
- Python 集合 day3
- VBS中转换二进制数据为字符串常用办法
- at shutdown 不起作用_at胎是什么胎
- JAVA制作QQ空间点赞_利用Javascript实现QQ空间自动点赞
- 保护板测试仪上位机软件,蓄电池性能测试仪放电部分与上位机软件设计
- awesome-python(python集合框架)
- RPM 包的构建 - SPEC 基础知识
- 计算机毕业论文致谢信范文,计算机毕业论文致谢
- 示波器基本原理1:模拟示波器
- RROR: [XSIM 43-3238] Failed to link the design.
- 【STM32F407开发板用户手册】第7章 STM32F407下载和调试方法(IAR8)
- 如何搭建多功能会议室
- 运行错误:view size is not compatible with input tensor‘s size and stride (at least