Это совершенно нормально - вы не должны ожидать, что получите все данные за один вызов, используете ли вы синхронные или асинхронные вызовы, много ли у вас данных или мало.
Вы должны продолжать чтение, пока вызов read не покажет, что данных больше нет - или пока у вас не будет все, что вам нужно. Если вашему протоколу требуется более одного запроса / ответа на соединение, вы должны либо префиксировать длину каждого сообщения, чтобы другая сторона знала, сколько нужно прочитать, либо иметь какой-либо разделитель для указания конца сообщения. Префикс длины намного проще, когда он подходит, но он не поддерживает потоковую передачу - вам нужно получить префиксы с префиксом длины и последний фрагмент, чтобы указать, когда вы закончите.