Python UDP 协议网络编程《五》

2022-07-04 19:52:46 浏览数 (1)

作者 | 无量测试之道 编辑 | 小 晴

今天继续和大家分享Python UDP 协议网络编程系列知识。

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

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

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

代码语言:javascript复制
 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()

0 人点赞