• 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: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

    欢迎关注【无量测试之道】公众号,回复【领取资源】,
    Python编程学习资源干货、
    Python+Appium框架APP的UI自动化、
    Python+Selenium框架Web的UI自动化、
    Python+Unittest框架API自动化、

    资源和代码 免费送啦~
    文章下方有公众号二维码,可直接微信扫一扫关注即可。

    备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

     添加关注,让我们一起共同成长!

  • 相关阅读:
    mysql-基础和基本指令
    网络笔试面试
    Windows访问Linux下的共享目录的配置方法
    帧动画 连续播放多张图片动画 以及ui动画 SoundPool
    ScrollView listView gridView 之间的冲突问题
    handler------post传送方式
    handler通信机制
    内部存储 openFileInputStream openFileOutputStream
    popupMenu-----弹出菜单
    为系统菜单添加图标--------暴力反射
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/13816733.html
Copyright © 2020-2023  润新知