read () гарантированно читает только 1 байт, все, что больше, это бонус.
Распространенный способ справиться с этим - использовать DataOutputStream и DataInputStream для отправки требуемого размера «блока».
public static void write(DataOutput out, byte[] bytes) throws IOException {
out.writeInt(bytes.length);
out.write(bytes);
}
public static byte[] read(DataInput in) throws IOException {
int len = in.readInt();
byte[] bytes = new byte[len];
in.readFully(bytes);
return bytes;
}