Это нормальное поведение для TCP (которое я предполагаю, что вы используете) - вы не имеете никакого реального контроля над тем, как пакеты фрагментируются, это только гарантирует, что пакеты будут доставлены в том же порядке.
Обычно приложения отправляют символ завершения (например, символ новой строки), чтобы указать, что было отправлено одно сообщение, а новые данные принадлежат следующему сообщению.
Интересно, откуда вы берете эти пустые строки - поскольку сообщение в 0 байтов указывает на то, что другая сторона хочет закрыть соединение.