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