Ваши круглые скобки выключены, код:
(0xFF & ((int)header[1] << 8))
, который всегда равен 0 (то же самое с << 16 и << 24), я думаю, вы имели в виду: </p>
((0xFF & ((int)header[1])) << 8)
Это приведет к тому, что будет прочитано недостаточно байтов сообщения, что также приведет к несоответствию синхронизации (в отличие от чтения слишком большого числа).
Редактировать : теперь вы исправили вышесказанное, я не вижу ничего плохого. Не могли бы вы сообщить нам соотношение между длиной первого сообщения и точным количеством байтов, которые были съедены?
Исходя из показанного кода, мое единственное предположение состоит в том, что вы отредактировали некоторые из показанных примеров поведения, которые могут повлиять на канал, на этот канал ссылаются в другом месте?
Если строка:
ByteBuffer buf = ByteBuffer.allocate(4);
будет за пределами while
, что приведет к описанному вами поведению, но в вашем примере кода это не так.