1. 程式人生 > 實用技巧 >Python UDP 協議網路程式設計《四》

Python UDP 協議網路程式設計《四》

今日主題:使用Python 實現的下載檔案的客戶端功能。

溫馨提示:
今日內容與上一篇文章Python UDP 協議網路程式設計《三》具有關聯性,如果Python UDP 協議網路程式設計《三》沒有閱讀的小夥伴,建議先閱讀後,再來學習今天的內容,有助於更好的理解喲(點選藍色字型的推文名稱即可檢視上一篇文章全部內容)。

理論內容較少,今天更偏實戰性,以下實現程式碼需仔細分析、理解每一行程式碼的作用及相互間的關聯關係,並自行搭建本地環境將程式碼執行起來,在解決問題的過程中,通過思考與實踐才能更好的理解本文主題。

 1import struct
 2from socket import socket,AF_INET,SOCK_DGRAM
 
3 4filename="QR.png" #定義要下載的檔名 5ftp_server_ip="127.0.0.1" #定義伺服器的ip地址 6 7def download_file(): 8 print("step1:準備開始下載"+filename+"檔案") 9 send_data=struct.pack("!H%dsb5sb"%len(filename),1,filename.encode("utf-8"),0,b'octet',0) #封裝一個讀檔案請求,上面的步驟1 10 print("step2:建立一個udp socket連線") 11 udp_socket=socket(AF_INET,SOCK_DGRAM) #
建立一個udp socket 12 print("step3:向tftp ip=127.0.0.1 port=69伺服器傳送讀寫請求") 13 udp_socket.sendto(send_data,(ftp_server_ip,69)) #向tftp 伺服器傳送讀寫請求 14 print("step4:新建一個檔案控制代碼,為了接收想下載的檔案內容") 15 fhandle=open(filename,'ab')#在本地建立一個檔案,a表示追加,b表示二進位制 16 while 1: 17 print("step5:開始接收訊息,訊息內容為接收的資料和伺服器資訊
") 18 recv_data,server_info=udp_socket.recvfrom(1024) #接收資料,返回的是二維元組,第一個是接收的資料,第二個是伺服器ip and port,上面的步驟2 19 operation_code=struct.unpack("!H",recv_data[:2]) #獲取操作碼 20 ack_num=struct.unpack("!H",recv_data[2:4]) #獲取資料塊 21 print("step6: 獲取操作碼:", operation_code, "和資料塊編號", ack_num) 22 print("step7: 列印:the server of info is:",server_info) 23 if operation_code==5:#5就是錯誤碼 24 print("the file is not found") 25 break 26 print("step8:列印接收的資料:",recv_data) 27 print("step9:開始寫檔案") 28 fhandle.write(recv_data[4:])#寫內容到檔案,因為前四個位元組是操作碼和資料塊,所以要從第四位開始寫檔案 29 print("step10:判斷檔案是否讀取完成") 30 if(len(recv_data)<516):#判斷檔案是否讀取完成,上面的步驟4 31 fhandle.close() 32 break 33 ''' 34 3、ACK 35 操作碼 + 塊編碼 36 2Bytes 2Bytes 37 '''#因為釋出ACK包的操作碼與塊編碼都是2個位元組,所以如下用的是HH 38 print("step10:封裝確認包資訊") 39 send_data1=struct.pack("!HH",4,ack_num[0]) #封裝確認包資訊 40 print("step11:獲取伺服器端ip and port") 41 server_port=server_info[1]#獲取伺服器端傳送資料的隨機埠 42 server_address=server_info[0] 43 print("step12:傳送ACK 確認包資訊") 44 udp_socket.sendto(send_data1,(server_address,server_port))#傳送確認包資訊,上面的步驟3 45 print("step13:檔案"+filename+"下載成功!!!") 46 47def user_login(): 48 udp_socket = socket(AF_INET, SOCK_DGRAM) # 建議upd連線 49 local_address = ('127.0.0.1', 8000) # 定義了本機的ip and port 50 udp_socket.bind(local_address) # 繫結本機的ip and port 51 resvice_address=('127.0.0.1', 69) #定義了接收訊息機器的ip and port 52 data="admin 123456" 53 udp_socket.sendto(str(data).encode("utf-8"),resvice_address)#向接收訊息機器傳送訊息 54 udp_socket.close() 55 udp_secv_msg() 56 57def udp_secv_msg(): 58 udp_sockets = socket(AF_INET, SOCK_DGRAM) # 建立udp socker連線 59 server_address = ('127.0.0.1', 70) # 定義了服務端的ip and port 60 udp_sockets.bind(server_address) # 服務端繫結ip and port 61 recv_data = udp_sockets.recvfrom(1024) # 收資料等待 62 print('接收的內容:', recv_data[0].decode('utf-8')) # 顯示收到的資訊 63 print('傳送人的地址:', recv_data[1]) # 顯示收到的資訊 64 udp_sockets.close() 65 66if __name__ == '__main__': 67 #第一步登入tftp伺服器 68 user_login() 69 #第二步是下載檔案 70 download_file()

歡迎關注【無量測試之道】公眾號,回覆【領取資源】,
Python程式設計學習資源乾貨、
Python+Appium框架APP的UI自動化、
Python+Selenium框架Web的UI自動化、
Python+Unittest框架API自動化、

資源和程式碼 免費送啦~
文章下方有公眾號二維碼,可直接微信掃一掃關注即可。

備註:我的個人公眾號已正式開通,致力於測試技術的分享,包含:大資料測試、功能測試,測試開發,API介面自動化、測試運維、UI自動化測試等,微信搜尋公眾號:“無量測試之道”,或掃描下方二維碼:

新增關注,讓我們一起共同成長!