zoukankan      html  css  js  c++  java
  • Python UDP 协议网络编程《五》

    今日主题:使用Python 实现的上传文件的客户端功能。

    温馨提示:
    今日内容与前期推文Python UDP 协议网络编程《三》具有关联性,如果Python UDP 协议网络编程《三》没有阅读的小伙伴,建议先阅读后,再来学习今天的内容,有助于更好的理解哟(点击蓝色字体的推文名称即可查看上一篇文章全部内容)。

    今日分享内容与上篇文章主题:使用Python 实现的下载文件的客户端功能一样,理论内容较少,今天更偏实战性,以下实现代码需仔细分析、理解每一行代码的作用及相互间的关联关系,并自行搭建本地环境将代码运行起来,在解决问题的过程中,通过思考与实践才能更好的理解本文主题。

     1import struct
     2from socket import *
     3
     4server_ip = '127.0.0.1'
     5filename='requirements.txt'
     6
     7def upload_file():
     8    #
     9    send_data_1 = struct.pack('!H%dsb5sb'%len(filename),2,filename.encode('utf-8'),0,b'octet',0)
    10    udp_socket = socket(AF_INET,SOCK_DGRAM)
    11    udp_socket.sendto(send_data_1,(server_ip,69)) #第一次发给服务器69端口
    12    filehandle = open(filename,'rb')
    13    recv_data = udp_socket.recvfrom(1024) #第一次接收数据
    14    rand_port = recv_data[1][1]
    15    # ack_num = struct.unpack("!HH",recv_data[0][:4])
    16    num = 0
    17    while True:
    18        read_data = filehandle.read(512)
    19        send_data = struct.pack('!HH',3,num) + read_data
    20        udp_socket.sendto(send_data,(server_ip,rand_port)) #第二次发给服务器的随机端口
    21        recv_data_2,userinfo = udp_socket.recvfrom(1024)
    22        print(recv_data_2)
    23        ack_num = struct.unpack('!H',recv_data_2[2:4])
    24        print(len(read_data),num,ack_num[0],rand_port)
    25        if len(read_data) < 512 or ack_num[0] != num :
    26            filehandle.close()
    27            break
    28        num = num + 1
    29
    30def user_login():
    31    udp_socket = socket(AF_INET, SOCK_DGRAM)  # 建议upd连接
    32    local_address = ('127.0.0.1', 8000)  # 定义了本机的ip and port
    33    udp_socket.bind(local_address)  # 绑定本机的ip and port
    34    resvice_address=('127.0.0.1', 69) #定义了接收消息机器的ip and port
    35    data="admin 123456"
    36    udp_socket.sendto(str(data).encode("utf-8"),resvice_address)#向接收消息机器发送消息
    37    udp_socket.close()
    38    udp_secv_msg()
    39
    40def udp_secv_msg():
    41    udp_sockets = socket(AF_INET, SOCK_DGRAM)  # 建立udp socker连接
    42    server_address = ('127.0.0.1', 70)  # 定义了服务端的ip and port
    43    udp_sockets.bind(server_address)  # 服务端绑定ip and port
    44    recv_data = udp_sockets.recvfrom(1024)  # 收数据等待
    45    print('接收的内容:', recv_data[0].decode('utf-8'))  # 显示收到的信息
    46    print('发送人的地址:', recv_data[1])  # 显示收到的信息
    47    udp_sockets.close()
    48
    49if __name__ == '__main__':
    50    # 第一步登录tftp服务器
    51    user_login()
    52    # 第二步是上传文件
    53    upload_file()

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

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

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

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

  • 相关阅读:
    leetcode108 Convert Sorted Array to Binary Search Tree
    leetcode98 Validate Binary Search Tree
    leetcode103 Binary Tree Zigzag Level Order Traversal
    leetcode116 Populating Next Right Pointers in Each Node
    Python全栈之路Day15
    Python全栈之路Day11
    集群监控
    Python全栈之路Day10
    自动部署反向代理、web、nfs
    5.Scss的插值
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/13816714.html
Copyright © 2011-2022 走看看