Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Работа с классом InetAddress
Работа с классом URL
Просмотр файлов сервера Web
Копирование файлов сервера Web
Контрольная сумма аплета

Потоковые сокеты - сервер
Потоковые сокеты - клиент
Общение в реальном времени
Широковещатель-
ные сообщения

Аплет и расширение сервера Web

Назад Вперед

8.5. Подсчет контрольной суммы аплета

В этом примере мы показываем еще одно применение для класса URL - определение контрольной суммы байт-кода аплета. Аплет в процессе инициализации загружает файл своего собственного байт-кода с сервера Web и затем вычисляет его контрольную сумму. Такая техника может применяться для контроля неизменности аплетов.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Демонстрация
(ваш браузер должен уметь работать с аплетами Java JDK 1.1)

Немного теории

В библиотеке классов Java есть средства, предназначенные для подсчета контрольных сумм по алгоритмам CRC-32 и Adler-32. Мы уже рассказывали о них в разделе "7.25. Вычисление контрольной суммы файла".

Интересно, что эти средства можно использовать и для удаленного контроля сохранности файлов, расположенных в каталогах сервера Web, например, аплетов. Для этого вам потребуются класс URL и CheckedInputStream.

С первым классом вы уже знакомы по предыдущим примерам этого раздела. Что же касается класса CheckedInputStream, то он обеспечивает автоматический подсчет контрольной суммы при чтении файла. Алгоритм подсчета передается конструктору этого класса через второй параметр, например:

InputStream is;
Checksum cs = new CRC32();
CheckedInputStream cis = 
  new CheckedInputStream(is, cs);

После завершения операции чтения потока класса CheckedInputStream контрольная сумма может быть получена методом getChecksum(), определенным в этом классе.

Описание примера

Наш пример представляет собой аплет, в окне которого отображается адрес URL файла с байт-кодом аплета и контрольная сумма CRC-32 этого файла (рис. 1).

pic1.gif (1615 bytes)

Рис. 1. Аплет показывает в окне свою контрольную сумму

Рассмотрим исходный текст аплета.

Главный класс аплета CheckCheckSum создан на базе класса Applet. В нем мы определили три поля и три метода.

Поля класса CheckCheckSum

Поле u хранит адрес URL, созданный аплетом для собственного файла байт-кода:

URL u;

В поле szChecksum мы будем записывать текстовое представление вычисленной контрольной суммы файла байт-кода:

String szChecksum = null;

И, наконец, поле cs хранит ссылку на объект класса Checksum, выполняющий подсчет контрольной суммы:

Checksum cs = new CRC32();

Мы инициализируем его для применения алгоритма CRC-32.

Метод init класса CheckCheckSum

Метод init получает управление при инициализации аплета. Прежде всего он создает объект класса URL для файла собственного байт-кода:

try
{
  u = getCodeBase();
  u = new URL(u.toString() + 
    "CheckCheckSum.class");
  . . .
}
catch(Exception ioe)
{
  showStatus(ioe.toString());
}

Эта операция выполняется в два приема. Вначале с помощью метода getCodeBase мы получаем адрес URL каталога, содержащего байт-код аплета, а затем создаем объект класса URL для самого файла байт-кода.

Следующий этап - создание потока класса InputStream и потока класса CheckedInputStream:

InputStream is = u.openStream();
CheckedInputStream cis = 
  new CheckedInputStream(is, cs);

Здесь мы применили метод openStream, который в данном случае возвратит входной поток для файла байт-кода аплета.

Затем метод calculate, определенный в нашем приложении, вычисляет контрольную сумму файла:

szChecksum = calculate(cis);

Метод init также устанавливает желтый цвет фона окна аплета:

setBackground(Color.yellow);

Метод calculate класса CheckCheckSum

Метод calculate выполняет считывание входного потока, переданного ему через первый параметр:

byte[] buf = new byte[8000];
int nLength = 0;
try
{
  while(true)
  {
    int nReaded = is.read(buf);
    if(nReaded == -1)
      break;
  }
  is.close();
}
catch(Exception ioe)
{
  showStatus(ioe.toString());
}

Прочитанные данные помещаются в буфер buf, но никак не используются. Здесь важен процесс чтения, так как во время этого процесса происходит подсчет контрольной суммы.

Далее подсчитанная сумма извлекается и возвращается вызвавшему методу:

String s = (new Long(
  is.getChecksum().getValue())).toString();
return s;

Метод paint класса CheckCheckSum

Работа метода paint заключается в отображении адреса URL файла с байт-кодом аплета и контрольной суммы этого файла, вычисленной методом init на этапе инициализации:

public void paint(Graphics g)
{
  g.drawString("My own URL: " + u.toString(),
     10, 30);
  g.drawString("My own CRC-32: " + szChecksum,
     10, 50);
}

Назад Вперед

[Назад]