【问题标题】:UDP socket file transfer python 3.5UDP套接字文件传输python 3.5
【发布时间】:2019-06-07 12:38:02
【问题描述】:

如何使用 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 是一个不可靠的协议,您必须为其添加一些可靠性层。这不是一项微不足道的任务,将所有这些添加到您的微不足道的代码示例中,它只是设法发送/接收单个数据包,这会使问题过于宽泛。但是您可能会从使用多次发送和接收开始,以便传输更多数据。除此之外,请了解在 SO 提问时如何使用正确的代码格式。
  • 哦,好的,谢谢!对格式感到抱歉。
  • 如何拆分文件并发送出去?我不介意丢失几个数据包。

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


【解决方案1】:

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

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

另一方面,TCP 已经做到了这一切,它是可靠的,具有拥塞控制功能并且无处不在 - 您正在通过基于 TCP 的 HTTP 查看这个网页。

【讨论】:

  • 这并没有回答如何使用 UDP 来解决的问题。 UDP 可用于传输大文件,也可用于传输大文件,尽管需要在 UDP 之上添加类似于 TCP 的可靠性机制(如QUIC protocol)或接受潜在的数据丢失(如实时视频流)。
  • 是的,但我应该使用 UDP 来做,所以我想知道我该怎么做..
  • 我知道可以使用 UDP,但是从 OP 来看(从头开始并传输现有的大文件,即不是实时流式传输),编写自己的协议会非常愚蠢,我支持我的回答。说真的,回到强制使用 UDP 的人那里,并解释 6 个月的时间来开发自己的协议来做比 TCP 已经做的更糟糕的事情是不值得的。
【解决方案2】:

如果您必须使用 UDP 而不是 TCP 或应用程序级协议,那么您应该能够使用 zfec 之类的包“生成冗余块”,以便即使不是所有数据包也可以重建原始数据收到了。

【讨论】:

    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 2016-07-23
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多