UDP套接字文件传输python 3.5

UDP socket file transfer python 3.5

如何在 python 3.5 中使用 UDP 套接字将大文件(视频、音频)从我的客户端传输到本地主机中的服务器?我能够发送一个小的 .txt 文件,但不能发送其他文件类型。请给我建议。 谢谢!

这是我传输文本文件的代码。

客户代码:

import socket
import sys

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

host = '127.0.0.1'
port=6000

msg="Trial msg"

msg=msg.encode('utf-8')

while 1:

    s.sendto(msg,(host,port))
    data, servaddr = s.recvfrom(1024)
    data=data.decode('utf-8')
    print("Server reply:", data)
    break
s.settimeout(5)   

filehandle=open("testing.txt","rb")

finalmsg=filehandle.read(1024)

s.sendto(finalmsg, (host,port))

服务器代码:

import socket

host='127.0.0.1'

port=6000

s=socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

s.bind(("",port))

print("waiting on port:", port)

while 1:

    data, clientaddr= s.recvfrom(1024)
    data=data.decode('utf-8')
    print(data)
    s.settimeout(4)
    break

reply="Got it thanks!"

reply=reply.encode('utf-8')

s.sendto(reply,clientaddr)

clientmsg, clientaddr=s.recvfrom(1024)

不要使用 UDP 传输大文件,使用 TCP。

UDP 不保证您发送的所有数据包都会到达,或者如果它们按顺序到达,它们甚至可能会重复。此外,UDP 不适合大型传输,因为 1) 它没有拥塞控制,因此您只会淹没网络并且数据包将被丢弃,并且 2) 您必须将数据包分解成通常大约 1400 字节的较小数据包建议保持在 MTU 之下,否则如果您依赖 IP 碎片并且丢失一个碎片,您的整个文件都会丢失。您将不得不编写自定义代码来解决 UDP 的所有这些问题,因为文件传输需要可靠地发送所有内容。

另一方面,TCP 已经完成了所有这一切,它可靠,具有拥塞控制并且无处不在 - 您正在通过 TCP 之上的 HTTP 查看此网页。

如果您必须使用 UDP 而不是 TCP 或应用程序级协议,那么您应该能够 'generate redundant blocks' 使用像 zfec 这样的包,这样您就可以重建原始数据,即使不是所有数据包都已收到。