套接字块/缓冲区大小

时间:2019-05-31 15:27:27

标签: python python-2.7 sockets select audio

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

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

这将导致两个大小均为1024,但是音频最终加速了。可以根据要求提供代码。任何帮助深表感谢!

1 个答案:

答案 0 :(得分:0)

TCP是字节流协议。您可以确保按发送的相同顺序获得字节,但不能按发送的相同块大小获得字节。使用(或设计)更高级别的协议(HTTP等)以确保您接收到所有已发送的字节。

例如,发送的第一个字节可以是以null终止的文件名,然后是文件大小(以null终止的字符串),然后是文件内容。接受连接后,接收方将缓冲s.recv(1024)调用并提取以空值终止的文件名和文件大小,然后继续读取,直到该缓冲区至少包含“文件大小”字节。

另一种选择是只发送文件并关闭连接,接收方缓冲接收到的所有内容,直到recv()返回零字节,表明连接已关闭。

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