tft每日頭條

 > 科技

 > python tcp數據流解析

python tcp數據流解析

科技 更新时间:2024-08-18 22:12:16

python tcp數據流解析?今天繼續和大家分享Python UDP 協議網絡編程系列知識,我來為大家講解一下關于python tcp數據流解析?跟着小編一起來看一看吧!

python tcp數據流解析(PythonUDP協議網絡編程六)1

python tcp數據流解析

今天繼續和大家分享Python UDP 協議網絡編程系列知識。

今日主題:Python 實現的使用命令行進行文件下載的功能。

溫馨提示:今日内容與前期推文Python UDP 協議網絡編程《四》具有一定的關聯性,是在該文章的基礎上進行的再一次改造。如果Python UDP 協議網絡編程《四》沒有閱讀的小夥伴,建議先閱讀後,再來學習今天的内容,會有一個比較直觀的對比。

今日分享内容與已分享的Python UDP 協議網絡編程系列推文一樣,理論内容較少,今天更偏實戰性,以下實現代碼需仔細分析、理解每一行代碼的作用及相互間的關聯關系,可與Python UDP 協議網絡編程《四》實現的功能進行對比,相信你會發現其中的不同。

同時建議小夥伴們自行搭建本地環境将代碼運行起來,在解決問題的過程中,通過思考與實踐才能更好的理解本文主題。

1import sys 2import struct 3from socket import socket,AF_INET,SOCK_DGRAM 4 5filename=""#定義要下載的文件名 6ftp_server_ip=""#定義服務器的ip地址 7username=""#用戶名 8password=""#密碼 9 10def run_cmd(): 11 global filename,ftp_server_ip,username,password 12 if(len(sys.argv)!=3): 13 print("命令行格式不對,請參照以下标準") 14 print("="*100) 15 print("for example:") 16 print() 17 print("python python_tftp_download.py username:password@ftp_server_ip filename") 18 print("=" * 100) 19 exit() 20 else: 21 filename=sys.argv[2] 22 all=sys.argv[1] 23 username=str(all).split(":")[0] 24 password=str(all).split("@")[0].split(":")[1] 25 ftp_server_ip=str(all).split("@")[1] 26 print(ftp_server_ip) 27 28def download_file(): 29 print("step1:準備開始下載" filename "文件") 30 send_data=struct.pack("!H%dsb5sb"%len(filename),1,filename.encode("utf-8"),0,b'octet',0) #封裝一個讀文件請求,上面的步驟1 31 print("step2:建立一個udp socket連接") 32 udp_socket=socket(AF_INET,SOCK_DGRAM) #創建一個udp socket 33 print("step3:向tftp ip=127.0.0.1 port=69服務器發送讀寫請求") 34 udp_socket.sendto(send_data,(ftp_server_ip,69)) #向tftp 服務器發送讀寫請求 35 print("step4:新建一個文件句柄,為了接收想下載的文件内容") 36 fhandle=open(filename,'ab')#在本地創建一個文件,a表示追加,b表示二進制 37 while 1: 38 print("step5:開始接收消息,消息内容為接收的數據和服務器信息") 39 recv_data,server_info=udp_socket.recvfrom(1024) #接收數據,返回的是二維元組,第一個是接收的數據,第二個是服務器ip and port,上面的步驟2 40 operation_code=struct.unpack("!H",recv_data[:2]) #獲取操作碼 41 ack_num=struct.unpack("!H",recv_data[2:4]) #獲取數據塊 42 print("step6: 獲取操作碼:", operation_code, "和數據塊編号", ack_num) 43 print("step7: 打印:the server of info is:",server_info) 44 if operation_code==5:#5就是錯誤碼 45 print("the file is not found") 46 break 47 print("step8:打印接收的數據:",recv_data) 48 print("step9:開始寫文件") 49 fhandle.write(recv_data[4:])#寫内容到文件,因為前四個字節是操作碼和數據塊,所以要從第四位開始寫文件 50 print("step10:判斷文件是否讀取完成") 51 if(len(recv_data)<516):#判斷文件是否讀取完成,上面的步驟4 52 fhandle.close() 53 break 54 ''' 55 3、ACK 56 操作碼 塊編碼 57 2Bytes 2Bytes 58 '''#因為發布ACK包的操作碼與塊編碼都是2個字節,所以如下用的是HH 59 print("step10:封裝确認包信息") 60 send_data1=struct.pack("!HH",4,ack_num[0]) #封裝确認包信息 61 print("step11:獲取服務器端ip and port") 62 server_port=server_info[1]#獲取服務器端發送數據的随機端口 63 server_address=server_info[0] 64 print("step12:發送ACK 确認包信息") 65 udp_socket.sendto(send_data1,(server_address,server_port))#發送确認包信息,上面的步驟3 66 print("step13:文件" filename "下載成功!!!") 67 68def user_login(data): 69 udp_socket = socket(AF_INET, SOCK_DGRAM) # 建議upd連接 70 local_address = ('127.0.0.1', 8001) # 定義了本機的ip and port 71 udp_socket.bind(local_address) # 綁定本機的ip and port 72 resvice_address=('127.0.0.1', 69) #定義了接收消息機器的ip and port 73 udp_socket.sendto(str(data).encode("utf-8"),resvice_address)#向接收消息機器發送消息 74 print("登錄成功") 75 udp_socket.close() 76 udp_secv_msg() 77 78def udp_secv_msg(): 79 print("開始接收消息") 80 udp_sockets = socket(AF_INET, SOCK_DGRAM) # 建立udp socker連接 81 server_address = (ftp_server_ip, 70) # 定義了服務端的ip and port 82 udp_sockets.bind(server_address) # 服務端綁定ip and port 83 print("正在接收消息") 84 recv_data = udp_sockets.recvfrom(1024) # 收數據等待 85 print("the data is:",recv_data) 86 print('接收的内容:', recv_data[0].decode('utf-8')) # 顯示收到的信息 87 print('發送人的地址:', recv_data[1]) # 顯示收到的信息 88 udp_sockets.close() 89 90if __name__ == '__main__': 91 #命令格式校驗 92 run_cmd() 93 data = username " " password 94 print(data) 95 #第一步登錄tftp服務器 96 user_login(data) 97 #第二步是下載文件 98 download_file()

1執行的結果為: 2(venv) D:\BaiduNetdiskDownload\ows-project\wechat\docker-compose1>python pythonFFTP_download_command.py admin:123456@127.0.0.1 requirements.txt 3127.0.0.1 4admin 123456 5登錄成功 6開始接收消息 7正在接收消息 8the data is: (b'\xe7\x99\xbb\xe5\xbd\x95\xe6\x88\x90\xe5\x8a\x9f,\xe5\x8f\xaf\xe4\xbb\xa5\xe5\xbc\x80\xe5\xa7\x8b\xe4\xb8\x8a\xe4\xbc\xa0\xe4\xb8\x8b\xe8\xbd\xbd\x 9e6\x96\x87\xe4\xbb\xb6\xe4\xba\x86\xef\xbc\x81\xef\xbc\x81\xef\xbc\x81', ('127.0.0.1', 8000)) 10接收的内容: 登錄成功,可以開始上傳下載文件了!!! 11發送人的地址: ('127.0.0.1', 8000) 12step1:準備開始下載requirements.txt文件 13step2:建立一個udp socket連接 14step3:向tftp ip=127.0.0.1 port=69服務器發送讀寫請求 15step4:新建一個文件句柄,為了接收想下載的文件内容 16step5:開始接收消息,消息内容為接收的數據和服務器信息 17step6: 獲取操作碼: (3,) 和數據塊編号 (0,) 18step7: 打印:the server of info is: ('127.0.0.1', 64495) 19step8:打印接收的數據: b'\x00\x03\x00\x00flask\r\nredis\r\npymysqlflask\r\nredis\r\npymysql' 20step9:開始寫文件 21step10:判斷文件是否讀取完成 22step13:文件requirements.txt下載成功!!!

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved