Размер сокета / размер буфера - PullRequest
0 голосов
/ 31 мая 2019

Я использую select для сокетного соединения в Python с размером фрагмента 1024 для отправки двух файлов wav.Сервер прослушивает два сокета, каждый из которых отправляет порции по 1024 (проверяется оператором print).Затем данные чанка помещаются в пустой массив NumPy для дальнейшей обработки, однако, когда я проверяю размер массива NUMPY, значение составляет только 512 для каждого массива, что приводит к объединению фрагмента 1024 на принимающей стороне и приводит к искаженному аудио,Я попытался отрегулировать размер чанка, а также использовать

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

, что приводит к тому, что оба размера равны 1024, однако в итоге звук ускоряется.Можем предоставить код по запросу.Любая помощь очень ценится!

1 Ответ

0 голосов
/ 31 мая 2019

TCP - это протокол потоковой передачи байтов.Вы гарантированно получите байты в том же порядке, но не в том же размере, что и отправленные.Используйте (или разработайте) протокол более высокого уровня (HTTP и т. Д.), Чтобы обеспечить получение всех отправленных байтов.

Например, первые отправленные байты могут быть именем файла с нулевым символом в конце, за которым следует размер файлав виде строки с нулевым символом в конце, за которой следует содержимое файла.При принятии соединения приемник буферизует s.recv(1024), вызывает и извлекает имя файла и размер файла, заканчивающиеся нулевыми значениями, а затем продолжает чтение, пока буфер не содержит как минимум байтов "размера файла".

Другой вариант заключается впросто передайте файл и закройте соединение, получатель буферизует все полученное, пока recv() не вернет ноль байтов, указывая на то, что соединение было закрыто.

Первый вариант позволяет отправлять несколько файлов без закрытия соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...