socket 实现udp 上传下载

from socket import *
import struct,sys
get_filename = None
def sock_config():
    global  get_filename
    get_filename = input("请输入下载的文件名:")
    send_data = struct.pack("!H"+str(len(get_filename))+"sb5sb",1,get_filename.encode("utf-8"),0,"octet".encode("utf-8"),0)
    udp_socket = socket(AF_INET, SOCK_DGRAM)
    udp_socket.bind(('',65533))
    udp_socket.sendto(send_data,("172.16.0.134",69))
    udp_socket.close()
    #sock_send = socket()
def sock_requst():
    request_sock = socket(AF_INET,SOCK_DGRAM)
    request_sock.bind(('',65533))
    create_file = False
    open_value = None
    check = 1
    while True:
        ret, recv_addr = request_sock.recvfrom(1024)
        oper = struct.unpack("!HH",ret[:4])

        if oper[0] == 5:
            print("文件不存在!")
            break
        else:
            create_file = True
        if create_file and open_value == None:
            f = open(get_filename, "wb+")
            open_value = 1
            create_file = False
        print(check," ",oper[1])
        if check == oper[1]:
            f.write(ret[4:])
        request_sock.sendto(struct.pack("!HH",4,oper[1]),(recv_addr[0],recv_addr[1]))
        print(oper, recv_addr, ret)
        #print("---第%d次写入---"%oper[1])
        if len(ret[4:]) < 512 :
            f.close()
            print("upload succend!")
            break
        check = oper[1]+1

    request_sock.close()
def mian():
    sock_config()
    sock_requst()
if __name__ == "__main__":
    mian()
from socket import *
import struct

def upload_request():
    send_Data = struct.pack("!H10sb5sb",2,"images.png".encode("utf-8"),0,"octet".encode("utf-8"),0)
    upload_socket = socket(AF_INET,SOCK_DGRAM)
    upload_socket.bind(('',65532))
    upload_socket.sendto(send_Data,("172.16.0.134",69))
    f = open("test.png","rb+")
    request_Data, recv_Addr = upload_socket.recvfrom(1024)[:4]
    request_ack, request_num = struct.unpack("!HH", request_Data[:4])
    num = 1
    if request_ack == 4 :
        while True:
            request_Data, recv_Addr = upload_socket.recvfrom(1024)[:4]
            request_ack, request_num = struct.unpack("!HH", request_Data[:4])
            if request_ack == 3 or request_ack == 4 :
                f_read = f.read(512)
                send_Data = struct.pack("!HH" + str(len(f_read)) + "s", 3,num,f_read)
                upload_socket.sendto(send_Data,recv_Addr)
            print(recv_Addr)
            print(request_ack,request_num,recv_Addr,send_Data)
            num += 1
    f.close()
    upload_socket.close()
if __name__ == "__main__":
    upload_request()
原文地址:https://www.cnblogs.com/gzww/p/7463022.html