Я не вижу проблем с кодом, который вы опубликовали для извлечения сообщения в строку, поэтому я предполагаю, что что-то еще происходит.
TCP не требуется для отправки всех данных, которые выочередь к нему за один раз.Это означает, что он может отправлять столько раз, сколько он хочет, и может разделить ваши данные на части по желанию.В частности, гарантированно разделяет ваши данные, если они не помещаются в один пакет.Как правило, максимальный размер пакета (он же MTU) составляет 1532 байта IIRC.
Поэтому существует реальная вероятность того, что данные отправляются, но в виде более одного пакета.Задержка между приемом первого и второго пакетов может означать, что при поступлении первого из них ваш код успешно читает все, что в нем содержится, а затем останавливается (больше никаких данных), прежде чем второй пакет успеет прибыть.
Выможно проверить эту гипотезу, наблюдая за сетевым трафиком или позволяя вашему приложению получать больше сообщений из сети и посмотреть, получит ли оно, наконец, все отправленные вами данные (хотя бы по частям).
В конечном итоге основная проблема заключается в том, чтоФундаментальная основанная на потоках (а не на сообщениях) природа TCP;даже если вы заставите этот код работать правильно, нет никакой гарантии, что он продолжит работать в будущем , потому что он делает предположения о вещах, которые не гарантирует TCP.
Чтобы быть в безопасности,вам нужно будет включить структуру, основанную на сообщениях (например, предварительно добавляя к каждому фрагменту данных ровно 4 байта, которые содержат его длину; тогда вы можете просто продолжать чтение до тех пор, пока не получите столько байтов).