日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2024/8/1 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TFTP协议下载服务器指定文件夹内的图片 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.



使用TFTP協(xié)議(Trivial File Transfer Protocol,簡單文件傳輸協(xié)議)下載服務器指定文件夾內的圖片

from socket import * # 若import socket,后續(xù)寫法為socket.socket()、socket.gethostname() import struct # struct模塊可以按照指定格式將Python數(shù)據(jù)轉換為字符串,該字符串為字節(jié)流 # TFTP(Trivial File Transfer Protocol,簡單文件傳輸協(xié)議),使用這個協(xié)議,就可以實現(xiàn)簡單文件的下載,tftp端口號為69。 from icecream import ic import os import randomos.chdir(r'D:\百戰(zhàn)python\Python網(wǎng)絡與并發(fā)編程——網(wǎng)絡\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'整合成字節(jié)流的數(shù)據(jù)包 # ! 表示按照網(wǎng)絡傳輸數(shù)據(jù)要求的形式來組織數(shù)據(jù)(占位的格式) # H 表示將后面的1替換成占兩個字節(jié) # 5s 相當于5個s(sssss)占5個字節(jié) # b 占一個字節(jié) s = socket(AF_INET, SOCK_DGRAM) # 采用IPV4,UDP協(xié)議創(chuàng)建套接字對象 s.sendto(send_data, (server_ip, 69)) # 通過套接字對象把數(shù)據(jù)包發(fā)送到服務器的69號端口。服務器的69端口只用來接收讀寫請求 f = open(r'C:/Users/mac/PycharmProjects/pythonProject/myproject01/venv/第三章網(wǎng)絡/{}'.format(filename), 'ab') # 創(chuàng)建一個與下載的文件同名的空文件 n = 1 while True: # 創(chuàng)建循環(huán)體,接收TFTP服務器返回的數(shù)據(jù)包receive_data = s.recvfrom(1024) # 接收數(shù)據(jù)if n == 1:ic(receive_data)operation_code, block_num = struct.unpack('!HH', receive_data[0][:4]) # operation code操作碼,block_num塊編號# 以HH兩個字節(jié)為一組的方式解析字節(jié)流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,則表示錯誤,停止接收,跳出循環(huán)體print('文件不存在')breakf.write(receive_data[0][4:]) # 寫入數(shù)據(jù)if len(receive_data[0]) < 516: # 若數(shù)據(jù)包長度小于516,說明數(shù)據(jù)下載完成ic(receive_data)print(f'數(shù)據(jù)接收{n}次,完成下載,文件的字節(jié)數(shù)為{514*(n-1)+len(receive_data[0])-2}') # 程序接收過程不止咱們提到的這些信息,他還包括字節(jié)流順序等等一些信息ic(os.path.getsize(filename)) # 傳輸過程的大小不能作為文件大小,實際獲取用os模塊breakack_data = struct.pack('!HH', 4, block_num) # 發(fā)送確認包的格式為HH(兩個字節(jié)為一組)。4表示確認包的操作碼。收到了發(fā)送的第block_num塊數(shù)據(jù)s.sendto(ack_data, (server_ip, rand_port)) # 回復確認包n += 1

運行結果:


總結

以上是生活随笔為你收集整理的TFTP协议下载服务器指定文件夹内的图片的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。