套接字块/缓冲区大小

问题描述 投票:0回答:1

我在 Python 中的块大小为 1024 的套接字连接上使用 select 来发送两个 wav 文件。服务器正在侦听两个套接字,它们都发送 1024 的块(使用 print 语句检查)。然后将块数据放入一个空的 numpy 数组中进行进一步处理,但是,当我检查 numpy 数组的大小时,每个数组的值仅为 512,导致接收端合并 1024 个块,导致音频失真。我尝试过调整块大小,以及使用

data = s.recv(1024)
data += s.recv(1024)

这会导致两个大小均为 1024,但音频最终会加速。可根据要求提供代码。非常感谢任何帮助!

python python-2.7 sockets select audio
1个回答
1
投票

TCP 是一种字节流协议。 您可以保证以与发送相同的顺序获取字节,但不会以与发送相同的块大小获取字节。 使用(或设计)更高级别的协议(HTTP 等)来确保您收到发送的所有字节。

例如,发送的第一个字节可以是以 null 结尾的文件名,后跟作为以 null 结尾的字符串的文件大小,最后是文件内容。接受连接后,接收方会缓冲

s.recv(1024)
调用并提取以 null 结尾的文件名和文件大小,然后继续读取,直到缓冲区至少包含“文件大小”字节。

另一种选择是仅传输文件并关闭连接,接收器缓冲接收到的所有内容,直到

recv()
返回零字节,表示连接已关闭。

第一个选项允许在不关闭连接的情况下发送多个文件。

© www.soinside.com 2019 - 2024. All rights reserved.