UDP套接字文件传输python 3.5

时间:2016-09-11 21:51:24

标签: python-3.x udp file-transfer large-files

如何使用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)

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

如果必须使用UDP而不是TCP或应用程序级协议,则应该能够使用zfec之类的包来“生成冗余块”,以便即使不是全部,也可以重建原始数据。数据包被接收。