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

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

今日主題:Python 實現的使用命令列進行檔案上傳的功能。

溫馨提示:
今日內容與前期推文Python UDP 協議網路程式設計《五》具有一定的關聯性,是在該文章的基礎上進行的再一次改造。如果Python UDP 協議網路程式設計《五》沒有閱讀的小夥伴,建議先閱讀後,再來學習今天的內容,會有一個比較直觀的對比。(點選藍色字型的推文名稱即可檢視上一篇文章全部內容)。

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

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

 1import sys
 2import struct
 3from socket import *
 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_upload.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 28 29def upload_file(): 30 send_data_1 = struct.pack('!H%dsb5sb'%len(filename),2,filename.encode('utf-8'),0,b'octet',0) 31 udp_socket = socket(AF_INET,SOCK_DGRAM) 32 udp_socket.sendto(send_data_1,(ftp_server_ip,69)) #第一次發給伺服器69埠 33 filehandle = open(filename,'rb') 34 recv_data = udp_socket.recvfrom(1024) #第一次接收資料 35 rand_port = recv_data[1][1] 36 # ack_num = struct.unpack("!HH",recv_data[0][:4]) 37 num = 0 38 while True: 39 read_data = filehandle.read(512) 40 send_data = struct.pack('!HH',3,num) + read_data 41 udp_socket.sendto(send_data,(ftp_server_ip,rand_port)) #第二次發給伺服器的隨機埠 42 recv_data_2,userinfo = udp_socket.recvfrom(1024) 43 print(recv_data_2) 44 ack_num = struct.unpack('!H',recv_data_2[2:4]) 45 print(len(read_data),num,ack_num[0],rand_port) 46 if len(read_data) < 512 or ack_num[0] != num : 47 filehandle.close() 48 break 49 num = num + 1 50 51def user_login(): 52 udp_socket = socket(AF_INET, SOCK_DGRAM) # 建議upd連線 53 local_address = ('127.0.0.1', 8000) # 定義了本機的ip and port 54 udp_socket.bind(local_address) # 繫結本機的ip and port 55 resvice_address=('127.0.0.1', 69) #定義了接收訊息機器的ip and port 56 data="admin 123456" 57 udp_socket.sendto(str(data).encode("utf-8"),resvice_address)#向接收訊息機器傳送訊息 58 udp_socket.close() 59 udp_secv_msg() 60 61def udp_secv_msg(): 62 udp_sockets = socket(AF_INET, SOCK_DGRAM) # 建立udp socker連線 63 server_address = ('127.0.0.1', 70) # 定義了服務端的ip and port 64 udp_sockets.bind(server_address) # 服務端繫結ip and port 65 recv_data = udp_sockets.recvfrom(1024) # 收資料等待 66 print('接收的內容:', recv_data[0].decode('utf-8')) # 顯示收到的資訊 67 print('傳送人的地址:', recv_data[1]) # 顯示收到的資訊 68 udp_sockets.close() 69 70if __name__ == '__main__': 71 # 命令格式校驗 72 run_cmd() 73 data = username + " " + password 74 print(data) 75 # 第一步登入tftp伺服器 76 user_login() 77 # 第二步是上傳檔案 78 upload_file() 命令列執行結果如下: 1(venv) D:\BaiduNetdiskDownload\ows-project\wechat\docker-compose1>python pythonFFTP_upload_command.py admin:[email protected] Dockerfile 2127.0.0.1 3admin 123456 4接收的內容: 登入成功,可以開始上傳下載檔案了!!! 5傳送人的地址: ('127.0.0.1', 8000) 6b'\x00\x04\x00\x00' 7143 0 0 57309

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

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

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

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