今日主题: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:123456@127.0.0.1 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自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:
添加关注,让我们一起共同成长!