TCP не гарантирует, что количество байтов, отправленных с помощью одной команды send в клиенте, будет таким же, как количество байтов, полученных на сервере с одной командой приема.TCP основан на потоке, что означает, что он обрабатывает соединение как поток байтов, а не как поток сообщений.
Отправка (две отправки):
- "Hello"
- «Мир»
Может быть получен как:
- «HelloWorld»
или.
- "Он"
- "Ило"
- "Мир"
или любая другая комбинация.
Следовательно, вам нужно уметьопределить, когда заканчивается одно сообщение, а начинается следующее.Два наиболее распространенных способа - использовать заголовок сообщения, содержащий длину или суффикс (например, перевод строки), для определения конца сообщения.
Обновление
TCP не должен использоваться для потоковой передачи аудио imho.Причина в том, что TCP гарантирует доставку всех отправленных пакетов.Следовательно, если TCP обнаружит, что пакет не прибыл, он заблокирует все поставленные в очередь пакеты, пока не прибудет отказавший.
При потоковой передаче звука не важно, что все пакеты прибывают, один потерянный пакет не будет слишком сильно влиять на звук.Лучше получить небольшую потерю звука, чем полностью остановить аудиопоток, потому что сетевые протоколы пытаются доставить все пакеты.