【发布时间】:2018-04-02 05:02:18
【问题描述】:
我正在尝试使用 Python 2.7 通过 UDP 套接字发送图像帧,我尝试发送的当前帧是 921600 字节 (640 x 480)。并且UDP消息的缓冲区限制为65507字节,所以我需要拆分消息,这是我的做法。
来自client.py:
image_string = frame.tostring() # frame is an multi-d numpy array
message_size = len(image_string)
sock.sendto(str(message_size), (HOST, PORT)) # First send the size
for i in xrange(0, message_size, 65507): # Split it and send
sock.sendto(image_string[i:i + 65507], (HOST, PORT))
sock.sendto("\n", (HOST, PORT)) # Mark the end to avoid hanging.
这是我在server.py 中收到它的方式,我插入了一些打印件进行调试。
image_string = ""
data, addr = sock.recvfrom(1024) # recieve image size
message_size = int(data)
print "Incoming image with size: " + data
for i in xrange(0, message_size, 65507):
data, addr = sock.recvfrom(65507)
image_string += data.strip()
print "received part, image is now:", len(image_string)
print "End of image"
因此,我正在以与发送消息相同的方式阅读消息,它在理论上可以检查,但在实践中却没有。可能是因为客户端完成发送后一些数据包丢失 - 服务器仍然卡在尝试读取(被阻止)。
我知道 UDP 不可靠且难以使用,但是我读到 UDP 用于许多视频流应用程序,所以我相信应该有解决这个问题的方法,但我找不到。
感谢所有帮助,谢谢。
Edit1:我怀疑丢包是问题的原因,是因为每次我运行测试时,在服务器挂起之前我已经发送了不同大小的图像。
Edit2:我忘了提到我在分区时尝试了不同大小的块,1024 和 500 字节没有区别(921600 中丢失了 5-20 字节)。但我应该提一下,我正在从 localhost 发送和接收,这已经提供了最小的错误。
【问题讨论】:
-
“我读到很多视频流应用都使用了UDP,所以我相信应该有解决这个问题的办法” - UDP用于视频的实时传输和音频,当丢包比接收迟到更好时。但在这种情况下,使用可以处理数据包丢失的适当编解码器。看起来您需要可靠的传输,并且没有实时要求。在这种情况下,您应该使用 TCP。
-
@SteffenUllrich 我意识到,当我自己尝试让它工作时。我还应该说,划分为块会使 UDP 中的传输非常慢,根据我的经验,TCP
sendall要快得多(我实际上是在制作实时流)。确实我无法处理数据包丢失,特别是因为数据包是一串 numpy 数组,我不知道如何在服务器端恢复(模仿)丢失的数据。或许我应该再问一个关于处理丢包的问题,谢谢。 -
这个问题的答案将是使用 TCP!要么就是这样,要么你实现了类似 TCP 的东西。
-
@eandersson 感谢您的建议,但很明显,我自己实现的任何东西都会比本机协议慢,除非我花大量时间在它上面,这不是我的愿望。
标签: python python-2.7 sockets server