作者 | 无量测试之道 编辑 | 小 晴
今天继续和大家分享Python UDP 协议网络编程系列知识。
今日主题:Python 实现的使用命令行进行文件上传的功能。
温馨提示: 今日内容与前期推文Python UDP 协议网络编程《五》具有一定的关联性,是在该文章的基础上进行的再一次改造。如果Python UDP 协议网络编程《五》没有阅读的小伙伴,建议先阅读后,再来学习今天的内容,会有一个比较直观的对比。(点击蓝色字体的推文名称即可查看上一篇文章全部内容)。
今日分享内容与已分享的Python UDP 协议网络编程系列推文一样,理论内容较少,今天更偏实战性,以下实现代码需仔细分析、理解每一行代码的作用及相互间的关联关系,可与Python UDP 协议网络编程《五》实现的功能进行对比,相信你会发现其中的不同。
同时建议小伙伴们自行搭建本地环境将代码运行起来,在解决问题的过程中,通过思考与实践才能更好的理解本文主题。
代码语言:javascript复制 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()
命令行执行结果如下:
代码语言:javascript复制1(venv) D:BaiduNetdiskDownloadows-projectwechatdocker-compose1>python pythonFFTP_upload_command.py admin:123456@127.0.0.1 Dockerfile
2127.0.0.1
3admin 123456
4接收的内容: 登录成功,可以开始上传下载文件了!!!
5发送人的地址: ('127.0.0.1', 8000)
6b'x00x04x00x00'
7143 0 0 57309