Ты делаешь это сложнее, чем нужно. Если вы отправляете двоичные данные, и клиенту необходимо распознать границы сообщения, то да, вы хотите сначала отправить длину сообщения или использовать какое-то «кадрирование» для определения границ сообщения. Но в этом случае вам это не нужно. Вы можете просто записать текст сообщения в сокет, используя такой подход, как предложенный выше.
С другой стороны, партнер может просто сидеть в цикле, читая текст, пока сокет не будет закрыт. Если вы хотите, чтобы читатель обрабатывал текст построчно, вы можете пометить конец каждой строки символом новой строки. Затем читатель может просто просмотреть полученный текст в поисках этих символов новой строки.
Единственное, что может быть хитрым, это то, что, поскольку TCP ориентирован на байты, а не на сообщения, читатель не всегда получит текст в виде фрагментов того же размера, что и отправитель. (Обычно так и будет, но это не гарантировано.) Таким образом, ваш читатель должен уметь обрабатывать случай, когда одно чтение из сокета может получить часть строки или, возможно, объединение нескольких строк. Это не большая проблема, если вы кодируете вероятность того, что это может произойти.