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 这样的包,这样您就可以重建原始数据,即使不是所有数据包都已收到。
如何在 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 这样的包,这样您就可以重建原始数据,即使不是所有数据包都已收到。