Краткий ответ: границы сообщений и соединения.
С помощью потокового сокета вы можете написать два пятибайтовых сообщения и в итоге прочитать одно десятибайтовое сообщение.Это связано с тем, что записываемые вами данные просто помещаются в один поток без каких-либо границ между записанными данными.Это похоже на запись слова в файл.Как читатель файла, как вы узнаете, писал ли автор изначально в файл по одному символу за раз, одному слову за раз, одному предложению за раз, одному абзацу за раз или написал весь файл одновременно?По сути, если файл уже записан, вы этого не сделаете.С потоком, как вы узнаете, что источник отправил два пятибайтовых сообщения или одно десятибайтовое сообщение, если отправка была выполнена в быстрой последовательности?Вы должны иметь некоторую длину или разделитель, чтобы помочь указать границы сообщения.Иногда вам нет дела до сообщений или их границ.В других случаях вы добавляете данные уровня приложения (например, заголовки, разделители, заранее заданные длины сообщений и т. Д.).Это также делает возможным использование потокового сокета, поскольку вы сами обрабатываете сообщения (т. Е. На уровне приложения).
В случае сокета на основе дейтаграммы получатель знает размер сообщений, отправленных отправителем, посколькуони доставляются 1: 1 (потери при прохождении, потери и т. д.), сохраняя свои первоначальные размеры.
В дополнение ко всему этому потоковые сокеты обычно ориентированы на соединение и 1: 1, тогда каксокеты датаграмм без соединения и потенциально один (источник) ко многим (получателям), с широковещательной / многоадресной передачей.