Архитектура языка Java

 

СОДЕРЖАНИЕ


РЕФЕРАТ

ТЕХНИЧЕСКОЕ ЗАДАНИЕ

ВВЕДЕНИЕ

1 АРХИТЕКТУРА ЯЗЫКА JAVA

.1 Java - объектно-ориентированный язык

.2 Безопасность и виртуальная Java-машина

.3 Интерфейс Java API

. ПРАКТИЧЕСКОЕ ЗАДАНИЕ

.1. Пример использования приложения RMI

.2 Работа с программой «Calculator»

Выводы

Список литературы

ТЕХНИЧЕСКОЕ ЗАДАНИЕ


Ознакомиться с архитектурой java и java RMI. Какими характеристиками обладает этот язык, его основные свойства, базовая система и основные элементы. Какие основные архитектурные элементы имеет технология java RMI, их назначение и реализация. Кроме того, в курсовом проекте необходимо установить jdk1.3.1_19 и привести простой пример приложения Java RMI.

ВВЕДЕНИЕ


Java - объектно-ориентированный язык программирования <#"justify">·Java используется на 1.1 млрд. настольных ПК

·Ежегодно регистрируется 930 миллионов загрузок среды выполнения Java

·Java используется в 3 млрд. мобильных телефонов

·Ежегодно поставляется в 31 раз больше телефонов Java, чем телефонов Apple и Android вместе взятых

·Java используется в 100% всех проигрывателей Blu-ray

·Ежегодно выпускается 1.4 млрд. платформ Java Card

·На основе технологий Java работают приставки, принтеры, веб-камеры, игры, навигационные системы для автомобилей, терминалы для проведения лотерей, медицинские устройства, автоматы для оплаты парковки и многое другое.

RMI (англ. Remote Method Invocation) - программный интерфейс вызова удаленных методов в языке Java.

Интерфейсы Java не содержат исполняемого кода. RMI поддерживает два класса, реализующих один и тот же интерфейс. Первый класс является реализацией поведения и исполняется на сервере. Второй класс работает как промежуточный интерфейс для удаленной службы и исполняется на клиентской машине. Это показано на следующей диаграмме. Клиентская программа вызывает методы прокси-объекта, RMI передает запрос на удаленную JVM и направляет его в реализацию объекта. Любые возвращаемые из реализации значения передаются назад в прокси-объект и затем в клиентскую программу.

RMI-приложения часто включают в себя две отдельные программы: сервер и клиент. Типичное серверное приложение создает некоторые удаленные объекты, делает ссылки на них доступными и ожидает, когда клиенты вызовут методы этих удаленных объектов. Типичное клиентское приложение получает удаленную ссылку на один или более удаленных объектов на сервере, а затем вызывает их методы. RMI обеспечивает механизм, при помощи которого сервер и клиент связываются и передают информацию туда и обратно. Такое приложение иногда называют распределенным объектным приложением.

Одной из центральных и уникальных возможностей RMI является его способность "скачивать" байткоды (или просто код) класса объекта, если класс не определен в виртуальной машине получателя. Типы и поведение объекта, ранее доступного только на виртуальной машине сервера, может быть перекачан на другую, возможно, удаленную виртуальную машину. RMI передает объекты по их действительному типу, так что поведение таких объектов не меняется, когда они посылаются на другую виртуальную машину. Это позволяет новым типам быть введенным на удаленной виртуальной машине, что динамически расширяет поведение приложения. Вычислитель, являющийся примером в этой главе, использует способность RMI вводить новое поведение в распределенную программу.

1. АРХИТЕКТУРА ЯЗЫКА JAVA


1.1Java - объектно-ориентированный язык


Архитектура RMI основана на одном важном принципе: определение поведения и реализация этого поведения считаются разными понятиями. RMI дает возможность разделить и выполнить на разных JVM код, определяющий поведение, и код, реализующий поведение.

Это прекрасно соответствует требованиям распределенных систем, в которых клиенты знают об определениях служб, а серверы предоставляют эти службы.

Конкретно в RMI определение удаленной службы кодируется при помощи интерфейса Java. Реализация удаленной службы кодируется в классе. Таким образом, ключ к пониманию RMI - помнить, что интерфейсы определяют поведение, а классы определяют реализацию.

Язык Java - и компилируемый, и интерпретируемый.

Строго говоря, Java - это интерпретируемый язык, хотя на практике он и интерпретируется, и компилируется. Фактически только около 20% Java- кода интерпретируется браузером, однако это самые ответственные участки кода. Средства безопасности языка Java и его возможности работы на многих платформах базируются на том факте, что окончательные этапы процесса компиляции выполняются в клиентской части.

Сначала программист компилирует исходный текст программы на Java в байт- коды, используемые компилятором языка. Байт-коды являются двоичными и не зависят от архитектуры компьютера (или от платформы - что не отличается по сути). Байт-коды - не законченное приложение, они интерпретируются в среде выполнения Java-nporpaMM (Java runtime environment): обычно в роли среды выступает браузер. Поскольку каждая среда выполнения создается для конкретной платформы, законченный программный продукт будет работать на этой платформе.

Такой подход удобен для разработчиков, он означает, что Java-код остается неизменным и не зависит от того, для какой платформы код предназначается или в какой системе разрабатывается. Можно написать и скомпилировать Java-апплет в системе UNIX и встроить его в свою Web-страницу. Пользователи разных систем, имеющих отличающиеся среды, могут обратиться к этому новому апплету. При этом каждый пользователь должен использовать Java-совместимый браузер, и неважно, на чем он работает: на IBM, HP или Macintosh. При использовании Java нужно сопровождать только один исходный код, выполняющийся на множестве платформ. Достаточно один раз скомпилировать программу для того, чтобы она работала в разных системах.

Поскольку байт-коды Java интерпретируются, нужно учесть, что Web- страницы, имеющие апплеты, зачастую загружаются намного дольше. Эти затраты времени объясняются тем, что байт-коды апплетов или автономных приложений содержат больше данных, необходимых во время компиляции, чем обычно требуется в не интерпретируемых программах. Байт-коды загру жаются в клиентскую систему подобно тому, как загружаются HTML-коды или изображения, составляющие Web-страницу. Затем оперативно проверяется безопасность или надежность апплета. Переносимость языка Java достигается ценой снижения производительности, которое может оказаться весьма существенным.

Этот недостаток преодолен в J IT-компиляторах (Just-in-Time - "своевременный"). JIT-компилятор транслирует методы Java в машинно-зависимый код для используемой платформы. Без такого транслятора методы не преобразуются в машинно-зависимый код, а остаются в виде исходных машинно- независимых байт-кодов, которые интерпретируются на любой платформе виртуальной машиной Java. Java-приложения переносимы, а сам JIT- компилятор не может быть переносимым, поскольку он генерирует машинно-зависимый код для конкретной платформы аналогично тому, как для каждой новой платформы требуется другая версия операционной системы. В настоящее время браузеры Netscape Navigator 3.0 и Microsoft Internet Explorer 3.0 используют JIT-компиляторы.

Почему такая комбинация методов компиляции и интерпретации является достоинством?Она обеспечивает защищенность и устойчивость. Среда выполнения Java имеет элемент, называемый компоновщиком (linker), который проверяет данные, поступающие в компьютер, и определяет, не содержат ли они потенциально опасные файлы (защищенность) или файлы, способные вызвать сбой в работе вашего компьютера (устойчивость).

Язык Java является объектно-ориентированным и, следовательно, относится к группе языков, рассматривающих данные как объекты и методы, используемые для этих объектов. Как уже упоминалось, языки Java и С++ имеют в своей основе множество одинаковых принципов; они отличаются только стилем и структурой.

Попросту говоря, языки объектно-ориентированного программирования (ООП) описывают взаимодействия между объектами данных. Многие языки ООП поддерживают множественное наследование, которое иногда приводит к неоднозначности и ненужным усложнениям. В языке Java эта возможность отсутствует и поддерживается только простое наследование. Это означает, что каждый класс в отдельный момент времени может порождаться только от одного какого-либо класса. При таком подходе к наследованию устраняются проблемы с классом, порожденным от противоречивых или взаимоисключаемых классов. В языке Java можно создавать совершенно абстрактные классы, называемые интерфейсами (interface). Интерфейсы позволяют описывать методы, разделяемые между несколькими классами, не учитывая при этом то, как другие классы используют данные методы.

Каждый класс, абстрактный или конкретный, описывает поведение объекта посредством некоторого набора методов. Весь программный код в языке Java содержится в описаниях классов. Методы могут наследоваться от одного класса к другому, при этом во главе иерархии классов находится класс object, относящийся к пакету java.lang, содержащемуся в Java Core API. Интерфейс программирования Java Core API описывается в последнем разделе данной главы.

Объекты могут порождаться от любого количества интерфейсов (или абстрактных классов). Интерфейсы в языке Java во многом напоминают интерфейсы Языка Описания Интерфейсов (Interface Definition Language, IDL), поэтому достаточно просто написать компилятор с языка IDL в Java.

Такой компилятор мог бы использоваться в Единой Архитектуре Программы- брокера Объектных Запросов (Common Object Request Broker Architecture, CORBA) - системе объектов для построения распределенных объектных систем. Нужно ли это? Да. Как интерфейсы IDL, так и система CORBA используются во множестве компьютерных систем, и это обеспечивает меж- платформную независимость языка Java.

Для упрощения языка в объектно-ориентированном языке Java не все данные являются объектами. Булевские типы, числа и другие простые типы не есть объекты, однако в языке все-таки имеются упакованные (wrapper) объекты для всех простых типов. Упакованные объекты позволяют наследовать простые типы подобно классам. Важно помнить, что Java - строгий объектно-ориентированный язык; никакая объявляемая переменная не может не быть объектом. С++ хотя и является языком ООП, однако позволяет нарушать стиль и использовать типы без инкапсуляции.

Объектно-ориентированное проектирование позволяет создавать модули типа plug and play - "включи-и-работай". Объектные средства языка Java в своем большинстве те же, что и в С++, с добавлением возможностей Objective С для более динамического разрешения методов.

Исходный текст Java-прогрэмм компилируется в байт-коды, а не в двоичные слова. Байт-коды выполняются JVM-машиной. Компилятор Java (программа javac) считывает файлы с расширением .java, конвертирует исходный текст в байт-коды и запоминает результат в файле с расширением .class.

JVM-машина рассматривает поток байт-кодов из файла с расширением .class как йоследовательность команд. Каждая команда состоит из однобайтного кода операции {opcode), представляющего конкретную и распознаваемую команду, и одного или нескольких операндов (данных, необходимых для выполнения операции). Код операции определяет действия JVM-машины. Если для выполнения операции нужна дополнительная информация, то за кодом операции следует операнд.

JVM-машину образуют четыре части:

·Стек;

·Механизм сборки мусора;

·Регистры;

·Область методов.

Длина адреса в JVM-машине равна 32 битам. Следовательно, можно адресовать до 4 Гб памяти, состоящей из отдельных байтов. Каждый регистр JVM- машины хранит один 32-разрядный адрес. Стек, механизм сборки мусора и область методов располагаются в пределах 4 Гб адресуемой памяти. Данное ограничение не является принципиальным, поскольку в настоящее время персональные компьютеры имеют не более 32 Мб ОЗУ. Размер отдельного метода Java ограничен 32 Кб.

Все процессоры используют регистры. В JVM-машине для управления системным стеком задействуются следующие регистры:

·Счетчик команд (program counter) отслеживает выполнение программы;

·Указатель верхушки стека операндов (optop);

·Указатель текущей среды выполнения {frame);

·Указатель первой локальной переменной в текущей среде выполнения {vars).

При разработке Java было принято решение о том, чтобы в языке использовались четыре регистра, поскольку если бы целевой процессор имел меньшее число регистров, то производительность значительно бы снизилась.

Стек - это область памяти, где хранятся параметры в JVM-машине. Java- программа передает байт-коды JVM-машине, где для каждого метода создается фрейм стека.

Каждый фрейм содержит информацию трех типов:

·Локальные переменные. Массив 32-разрядных переменных, на который указывает регистр vars

·Среда выполнения. Область выполнения метода, на которую ссылается регистр frame

·Стек операндов. Работает по принципу "первым вошел - первым вышел" (FIFO). Имеет разрядность 32 бита и содержит аргументы, необходимые для кодов операции. Верхушка данного' стека адресуется при помощи регистра optop

JVM-машина имеет еще две области памяти:

·Область методов

·Область констант

На реальное местоположение этих областей не накладывается никаких ограничений, и это увеличивает переносимость и защищенность, JVM- машины. Защищенность достигается за счет того, что при произвольном положении этих областей хакер не может перехватить указатель памяти.

JVM-машина работает со следующими базовыми типами данных:

·byte (8 бит)

·float (32 бит)

·int (32 бит)

·short (16 бит)

·double (64 бит)

·char (16 бит)

·long (64 бит)


1.2 Безопасность и виртуальная Java-машина


Данный раздел состоит из шести частей. Обсуждаются вопросы безопасности распределенных вычислений в целом и рассматривается проблема защиты, связанная с исполняемым кодом. Предлагается шесть этапов для построения работоспособного и гибкого механизма безопасности. Также рассматривается реализация механизмов защиты в архитектуре языка Java. Как и во всякой новой технологии, имеются открытые вопросы, касающиеся безопасности в Java и до сих пор обсуждаемые в Сети и других форумах.

В данном разделе анализируется концепция безопасности в общем контексте взаимодействия в сети Web и реализация защиты посредством исполняемого кода.

Сначала рассмотрим двойственность вопроса безопасности в отношении сети Web и эволюцию сети Web как среды в контексте этой двойственности. Затем можно начинать описание проблемы защиты в контексте исполняемого кода.

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

Должен ли пользователь полностью изолировать внешнюю программу от ресурсов компьютера? Конечно же, нет. В подобном случае исполняемый код не смог бы сделать ничего полезного. Более полное и эффективное решение проблемы безопасности можно разбить на шесть этапов:

1.Предугадать любые потенциально опасные действия и методы вторжения.

2.Свести любые опасные действия к минимальному набору простейших операций.

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

4.Доказать логически или, если возможно, показать как очевидное тот факт, что язык и среда действительно защищены против методов преднамеренного вторжения.

5.Реализовать язык и разрешить исполняемым программам пользоваться только этим утвержденным безопасным языком.

Сценарии внешней атаки можно разбить на следующие группы (список не полный):

·Повреждение или нарушение целостности данных и/или состояния выполняемой программы;

·Сбор или копирование конфиденциальной информации;

·Блокирование ресурсов, вследствие которого они становятся недоступными для законных пользователей и программ;

·Захват ресурсов и их использование внешней неавторизованной программой;

·Создание нефатальных ситуаций, снижающих производительность, особенно в устройствах вывода;

·Присвоение прав доступа и использование их или компьютера клиента для вторжения в другие элементы сети.

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

Таблица1.1 Потенциально уязвимые объекты и типы воздействие

ОбъектыНарушение целостностиПерехват информацииБлокировка/ Изменение правЗахват ресурсаНефатальные помехиЗахват полномочийФайловая системаXXXXXОбъектыНарушение целостностиПерехват информацииБлокировка/ Изменение правЗахват ресурсаНефатальные помехиЗахват полномочийКонфиденциальная информацияXXXXXСетьXXXXXЦентральный процессорXXXПамятьXXXXУстройства выводаXXXXУстройства вводаXXXОС, состояние программXXXX

Вместо того чтобы рассматривать все возможные способы вмешательства, схема защиты в языке Java определяет уязвимые объекты основных потенциально опасных операций, что очень близко к описанному выше подходу.

Говоря конкретно, схема защиты языка Java рассматривает следующие уязвимые объекты:

·Память;

·ОС/состояние программ;

·Файловая система клиента;

·Сеть;

·При этом учитываются следующие типы вмешательств, перечисленные в табл. 1.1;

·Нарушение целостности программ в клиентской машине. Обычно вызывается вирусами, которые записывают себя в память и разрушают определенные файлы при возникновении некоторого события или по достижении некоторой даты;

·Блокировка/изменение прав пользования ресурсами клиентской машины. Обычно вызывается вирусами;

·Перехват информации в клиентской машине. К примеру, легко выполняется при помощи команды UNIX SENDMAIL;

·Захват полномочий клиентской машины. Достигается подменой IP- адресов. Этот тип компьютерной атаки был придуман Кевином Митни- ком (Kevin Mitnick), когда тот "взломал" один из личных компьютеров эксперта по системам защиты Сутумо Шимура (Tsutumo Shimura). Весь этот инцидент подробно описан в бестселлере "Разборки", написанной для "New York Times" Сутумо Шимурой.

Первый уровень безопасности в Java - это архитектура самого языка, синтаксические и семантические конструкции языка. Далее структура языка Java рассматривается с точки зрения безопасности.

Java - полноценный объектно-ориентированный язык; каждая отдельная структура данных (и, следовательно, производная от нее) представляет собой настоящий полнофункциональный объект. То, что каждая примитивная структура данных оформлена как объект, гарантирует наличие всех теоретических преимуществ защиты ООП-языков в программах, написанных на Java, включая их синтаксис и семантику:

·Инкапсуляция и сокрытие данных в private-объявлениях;

·Управляемый доступ к структурам данных, при котором; используются только public-методы;

·Наращиваемость и иерархическое построение сложной структуры программы;

·Отсутствие перегрузки операций.

Классы и методы можно объявлять как final, запрещая тем самым создание подклассов и переопределение методов. Такое объявление препятствует злонамеренному изменению проверенного кода.

В целях безопасности преобразования типов (typecasting) проверяются как статически, так и динамически; это гарантирует то, что объявленный на этапе компиляции тип объекта будет точно соответствовать типу объекта во время выполнения, даже если по отношению к этому объекту выполнялись операции преобразования типов. Контроль за преобразованием типов препятствует преднамеренной подмене типов данных.

Вероятно, эта особенность, реализованная непосредственно в языке Java, является основной гарантией безопасности. Отсутствие указателей в Java- программе обеспечивает то, что все элементы данных всегда имеют имя. Каждая простая структура данных или фрагмент кода имеют идентификатор, позволяющий полностью контролировать их.

Java является многопотоковым языком и обеспечивает защищенный потоковый доступ к структурам данных и объектам. В главе 14 потоки Java рассматриваются подробно, приводятся примеры прикладных программ.

С каждым объектом в языке Java связан уникальный хэш-код (hashcode). Это означает, что в любой момент возможен мониторинг состояния Java- программы.

Во время компиляции анализируются все механизмы защиты, существующие в синтаксисе языка Java, включая проверку согласованности объявлений private и public, правильности типов и инициализации всех переменных в соответствии с предопределенными значениями.

Исходные классы Java компилируются в байт-коды. Верификатор байт- кодов выполняет множество проверок согласованности и безопасности компилированного кода. При верификации байт-кодов выполняются следующие операции:

·Проверка переполнения стека и потери значимости указателя стека;

·Анализ доступа к регистрам;

·Проверка правильности параметров байт-кодов;

·Анализ потоков байт-кодов, создаваемых методами, что обеспечивает целостность стека проверка получаемых объектов и объектов, возвращаемых методами.

Классы Java описываются внутри пакетов. Имена классов связаны с названиями пакетов. Пакеты гарантируют, что код, полученный из сети, отличается от локального кода. Принятая библиотека классов не может по ошибке или преднамеренно заменить локальные библиотеки проверенных классов или перехватить их права, даже если эти библиотеки имеют одинаковые имена. Это также защищает от непроверенных, случайных взаимодействий локального и принятого классов.

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

По умолчанию механизм оперативной загрузки Java-ioiaccoB служит для выборки указанного класса из файла, расположенного в локальной хост-машине.

Любые другие способы загрузки классов, включая передачу по сети, требуют наличия соответствующего класса ClassLoader. ClassLoader - это подкласс стандартного класса Java ClassLoader, имеющего методы, которые реализуют все механизмы проверки согласованности и защиты и запускаются для каждого вновь загружаемого класса.

Из соображений безопасности класс ClassLoader не может выполнять никаких опережающих действий в отношении байт-кодов. Байт-коды могут быть получены из Java-программы, транслируемой Java-компилятором или компилятором С++, модифицированным для создания байт-кодов. Это означает, что ClassLoader запускается только после проверки поступившего байт-кода; этот класс отвечает за создание пространства имен для загруженного кода и разрешение ссылок на имена классов, адресованных в полученном коде. При этом для каждого пакета создаются отдельные пространства имен.

В языках С и С++ программист явным образом распределяет память, освобождает ее и следит за всеми указателями на выделенную память. Зачастую это усложняет сопровождение программ и является главным источником ошибок, приводящих к появлению "висячих ссылок", вызванных использованием null-указателей и неправильными операциями выделения и освобождения памяти.

В языке Java указатели отсутствуют, поэтому программист не должен явно управлять памятью. Выделение и освобождение памяти выполняются автоматически, структурированно и с точным соблюдением согласования типов Для освобождения неиспользуемой памяти вместо явных программируемых операций применяется механизм сборки мусора (дефрагментация памяти). При этом устраняется возможность ошибок распределения памяти и потенциальные проблемы с безопасностью. При ручном выделении и освобождении памяти возможны нелегальные операции дублирования, клонирования и захват полномочий доступных объектов, а также нарушение целостности данных.

Класс SecurityManager является базовым, расширяемым средством для построения систем безопасности и обеспечения механизмов защиты для других компонентов языка Java, включая библиотеки классов и внешние среды (например, Java-совместимые браузеры и машинно-зависимые методы). Сам класс SecurityManager не предназначен для непосредственного использования (по умолчанию каждая из проверок вызывает некоторую исключительную ситуацию по защите); это базовый класс для создания подклассов, реализующих заданный набор методов защиты.

Помимо других особенностей в классе SecurityManager имеются методы для распознавания процессов проверки безопасности, а также методы для выполнения следующих проверок:

·Защита от инсталляции дополнительного загрузчиков классов ClassLoader;

·Возможность компоновки динамических библиотек (используется для машинно-зависимого кода);

·Чтение из файла классов а Запись в файл классов;

·Создание сетевого соединения;

·Возможность соединения с некоторым сетевым портом;

·Разрешение входящего сетевого соединения;

·Доступность некоторого пакета;

·Добавление в пакет нового класса.

Главным источником опасности для Java-nporpaMM является Java-код, поступающий из сети и выполняющийся на клиентском компьютере. Подобные транспортируемые Java-nporpaMMbi называются апплетами. Java-апплет имеет четко определенный набор возможностей и ограничений на уровне языка, особенно в части механизмов защиты.

На апплеты, загружаемые по сети, накладываются следующие ограничения:

·Нельзя читать или модифицировать файлы локальной файловой системы;

·Нельзя создавать, переименовывать или копировать файлы и каталоги локальной файловой системы;

·Нельзя создавать произвольные сетевые соединения, за исключением связей с той хост-машиной, с которой апплеты были считаны. Имя хост- машины должно быть указано в URL-адресе той HTML-страницы, которая содержала тег <applet>, или задаваться в параметре codebase тега <applet>. Числовой IP-адрес хост-машины не допускается.

Перечисленные строгие ограничения на доступ к локальной файловой системе касаются апплетов, работающих в среде браузера Netscape Navigator 3.0. В программе Appletviewer из пакета JDK 1.0 ограничения менее строгие, и пользователь может определять явно список файлов, с которыми могут работать апплеты.

Апплеты могут считывать некоторые свойства системы при помощи вызова system.getProperty (string key). Апплеты в Netscape 3.0 имеют неограниченный доступ к этим свойствам. В программе JDK 1.0 Appletviewer от Sun можно индивидуально контролировать доступ к каждому свойству. В табл. 1.2 перечислена информация, возвращаемая для различных значений ключа key.

java интерфейс приложение программа

Таблица 1.2 Доступность системных переменных

КлючВозвращаемая информацияjava.versionНомер версии языка Javajava.vendorИнформация о производителе Java-средыj ava.vendor. urlURL-адрес производителя Java-средыjava.class.versionНомер версии Java-icnaccaos.nameНазвание операционной системыos.archАрхитектура операционной системыfile.separatorРазделитель файлов (например, /)path.separatorРазделитель пути (например,:)line.separatorРазделитель строк

В табл. 1.3 перечислены параметры, недоступные для апплетов в среде браузера Netscape 3.0. Программа JDK 1.0 Appletviewer и браузер HotJava позволяют пользователю управлять доступом к некоторым из указанных ресурсов.


Таблица 1.3 Системные переменные, недоступные для апплетов

КлючВозвращаемая информацияj ava. homeКаталог инсталляции Javaj ava.class.pathПуть к Java-wiaccaMuser.nameРегистрационное имя пользователяuser.homeДомашний каталог пользователяuser.dirТекущий рабочий каталог пользователя

Java-система загружает апплеты двумя способами. Апплет может быть передан по сети или же загружен из локальной файловой системы. Способ загрузки апплета определяет предоставляемые ему возможности.

С точки зрения безопасности, локальным апплетам разрешается выполнять следующие действия:

·Читать и записывать локальные файлы;

·Загружать в клиентской машине библиотеки;

·Выполнять в локальной машине внешние процессы;

·Останавливать работу виртуальной Java-машины.


1.3 Интерфейс Java API


Java Application Programming Interface (Интерфейс прикладного программирования), или Java API, - это набор классов, разработанных компанией Sun для работы с языком Java. Этот интерфейс помогает при создании собственных классов, апплетов и приложений. Используя уже готовые классы, можно написать Java-приложение длиной всего в несколько строк в отличие от сотен программных строк, необходимых для создания программы на С.

Классы в Java API сгруппированы в пакеты, в которых могут быть по несколько классов и интерфейсов. Более того, каждый элемент может также иметь различные свойства, например, поля и/или методы.

Хотя программы на Java можно писать, почти ничего не зная об Java API, каждый создаваемый класс будет зависеть по меньшей мере от одного

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

Ниже перечислены некоторые имеющиеся или разрабатываемые API- интерфейсы, не входящие в базовый набор:

·Java Enterprise API (включая JDBC, Java IDL, Java RMI и Object Serialization);

·Java Commerce. API (Java Wallet);

·Java Server API.

Java Media API (включая Java 2D, Java Media Framework [Clocks, Audio, Video, Midi], Java Share, Java Animation, Java Telephony и Java 3D)

·Java Security API;

·Java Management API;

·Java Beans API;

·Java Embedded API Java Core API.

В настоящее время Java Core API поставляется с языком Java версии 1.0.2. Эти пакеты позволяют создавать объекты, обязательные для всех реализаций Java:

·java.lang;

·java.net;

·java.awt.peer;

·java.io;

·java.awt;

·java.applet;

·java.util;

·java.awt.image;

·java.lang.

Пакет java.lang состоит из классов, образующих ядро языка Java. В нем имеются не только базовые типы данных, такие как character и integer, но и средства для обработки ошибок посредством классов Throwable и Error. Более того, классы SecurityManager И System предоставляют некоторые возможности управления средой выполнения Java.

java.io

Пакет java.io служит в языке Java стандартной библиотекой ввода/вывода. Данный пакет позволяет создавать потоки данных и управлять ими различным образом. В нем имеются как простые типы String, так и сложные, например StreamTokenizer.

ja va. util

Пакет java.util главным образом состоит из различных полезных классов, которые трудно отнести к какому-либо другому пакету. Среди этих вспомогательных классов такие:

·Класс Date, облегчающий работу с датами;

·Класс Hashtable;

·Классы для разработки ADT, например, stack и Vector

java.net

Пакет java.net делает язык Java сетевым, он предоставляет средства для связи с удаленными ресурсами, для чего можно создавать сокеты, подключаться к ним или использовать URL-ссылки. К примеру, при помощи этого пакета можно создать собственные клиентские и/или серверные программы для протоколов Telnet, Chat или FTP.

java.awt

Пакет java.awt также называют Оконный пользовательский интерфейс (Abstract Window Toolkit, AWT). В нем содержатся средства, позволяющие создавать мощные, привлекательные и удобные интерфейсы для апплетов и автономных программ. В этом пакете имеются не только управляющие классы, такие как GridBagLayout, но и некоторые конкретные интерактивные средства, например, Button и TextFieid. Что еще важнее - это класс Graphics, предоставляющий множество графических возможностей, включая средства для рисования фигур и вывода изображений..awt.image

Пакет java.awt.image тесно связан с java.awt. В данном пакете содержатся средства для манипулирования с изображениями, получаемыми по сети.

java.awt.peer

Пакет java.awt.peer - это набор интерфейсов, служащих промежуточным звеном между вашей прикладной программой и компьютером, на котором эта программа выполняется. Возможно, что вам не понадобится непосредственно работать с данным пакетом.

java.applet

Пакет java.applet самый маленький из всех в данном API-интерфейсе, однако, благодаря наличию класса Applet, он самый примечательный. Данный класс имеет множество полезных методов, поскольку является основой для всех апплетов и может также при помощи интерфейса

Appietcontext предоставлять информацию об окружении апплета.

Java Enterprise API

Java Enterprise API обеспечивает взаимодействие с корпоративными базами данных и запросными системами. При помощи данного API-интерфейса корпоративные разработчики могут строить распределенные клиент-серверные апплеты и приложения на Java, работающие в любых ОС или аппаратных платформах, имеющихся в компании.

Java Database Connectivity иди JDBC (Средства связи с базами данных) - это интерфейс доступа к стандартным SQL-базам, обеспечивающий взаимодействие с большим количеством реляционных баз данных. Многие слышали о стандарте ODBC. Компания Sun потратила много усилий на то, чтобы сделать язык Java совместимым со всеми современными компьютерными стандартами.

Язык Java IDL разработан на основе спецификации OMG Interface Definition Language (Язык описания интерфейсов) как универсальное средство для определения интерфейса между объектом и клиентом на различных платформах.

Java RMI - это механизм вызова удаленных методов (remote-method invocation) для равноправных узлов или для клиента и сервера в тех случаях, когда приложения на обоих узлах написаны на Java.

Java Commerce API

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

Java Server API

Интерфейс Java Server API - это масштабируемая платформа, позволяющая легко разрабатывать разнообразные Java-совместимые серверы Internet и intranet. Java Server API обеспечивает единый и согласованный доступ к серверу и административным системным ресурсам. Этот API-интерфейс нужен тем разработчикам, кто хочет быстро разрабатывать собственные Java- сервлеты - исполняемые программы, загружаемые пользователями для заг пуска в сети или на серверах.

Java Media API

Java Media API позволяет пользователям и разработчикам легко и гибко использовать преимущества многочисленных мощных, интерактивных средств сети Web. Модуль Media Framework имеет часы для синхронизации и медиаплейеры для воспроизведения аудио-, видео- и MIDI-файлов. Модули 2D и 3D обеспечивают развитые средства обработки изображений. Для создания движущихся и трансформирующихся 20-объектов можно применять анимацию. Модуль Java.

Share обеспечивает совместное использование приложений многими пользователями; пример такого приложения - коллективная "белая доска". И наконец, модуль Telephony позволяет интегрировать телефон и компьютер. Вероятно, интереснее всего попробовать этот модуль.

Java Security API

Java Security API - это платформа для тех разработчиков, кто хочет легко и надежно включить средства защиты в свои апплеты и приложения. Среди предоставляемых средств: шифрование с цифровыми подписями, кодирование и проверка прав на доступ.

Java Management API

Интерфейс Java Management API располагает большим набором масштабируемых Java-объектов и методов для построение апплетов, могущих управлять корпоративными сетями через Internet и intranet-сети. Данный API был разработан компанией SunSoft совместно со многими лидерами компьютерной индустрии, в их числе компании AutoTrol, Bay Networks, BGS, ВМС, Central Design Systems, Cisco Systems, Computer Associates, CompuWare, LandMark Technologies, Legato Systems, Novell, OpenVision, Platinum Technologies, Tivoli Systems и 3Com.

Java Beans API

Java Beans API - это переносимый, межплатформный набор API-интерфейсов для программных компонентов. Модули Java Beans можно будет подключать к существующим структурам, например к компонентам Microsoft OLE/COM/Active-X, OpenDoc и Netscape LiveConnect. Конечный пользователь сможет компоновать компоненты Java Beans при помощи построителей приложений. К примеру, компонент "кнопка" может запустить создание диаграммы в другом компоненте, или же компонент передачи данных в реальном времени может представляться другим компонентом в виде графика. (В настоящий момент Java Beans - это кодовое название продукта для внутреннего пользования.)

Java Embedded API

Интерфейс Java Embedded API является подмножеством Java API для встроенных устройств, полностью поддерживающих Java Core API. Данный интерфейс включает минимальный встраиваемый API, построенный на базе классов java.lang, java.util и, частично, java.io. Кроме того, имеются некоторые расширения для определенных задач, например, для работы в сети и графических интерфейсов.

2. ПРАКТИЧЕСКОЕ ЗАДАНИЕ


2.1 Пример использования приложения RMI


Мы создадим простую удаленную службу, реализующую программу калькулятор, и будем использовать ее из клиентской программы.

Компьютерная RMI-система состоит из нескольких частей.

  • Определение интерфейсов для удаленных служб
  • Реализация удаленных служб
  • Файлы заглушки и скелета
  • Сервер, предоставляющий удаленные службы
  • Служба имен RMI, дающая возможность клиентам найти удаленные службы
  • Поставщик файла классов (HTTP или FTP-сервер)
  • Клиентская программа, которая нуждается в удаленных службах

Для упрощения задачи мы будем использовать один и тот же каталог для кода как клиента, так и сервера. При запуске клиента и сервера из одного и того же каталога нам не придется настраивать HTTP или FTP серверы для доступа к файлам классов.

Если предположить, что RMI-система уже спроектирована, для ее реализации необходимо выполнить следующие шаги:

  1. Написать и откомпилировать Java-код для интерфейсов
  2. Написать и откомпилировать Java-код для классов реализации
  3. Создать файлы классов заглушки и скелета из классов реализации
  4. Написать Java-код программы хоста для удаленного обслуживания
  5. Разработать Java-код для клиентской программы RMI
  6. Установить и запустить RMI-систему

Первым шагом является написание и компилирование Java-кода для интерфейсов служб.

Когда вы создаете удаленный интерфейс, вы должны следовать следующим правилам:

1.Удаленный интерфейс должен быть общедоступным - public (он не может иметь «доступ на уровне пакета», так же он не может быть «дружественным»). В противном случае клиенты будут получать ошибку при попытке загрузки объекта, реализующего удаленный интерфейс.

2.Удаленный интерфейс должен расширять интерфейс java.rmi. Remote.

.Каждый метод удаленного интерфейса должен объявлять java.rmi. RemoteException в своем предложении throws в добавок к любым исключениям, специфичным для приложения.

.Удаленный объект, передаваемый как аргумент или возвращаемое значение (либо напрямую, либо как к части локального объекта), должен быть объявлен как удаленный интерфейс, а не реализация класса.

Интерфейс Calculator определяет все удаленные возможности, предлагаемые службой:

public interface Calculatorjava.rmi. Remote {public long add (long a, long b)java.rmi. RemoteException;long sub (long a, long b)java.rmi. RemoteException;long mul (long a, long b)java.rmi. RemoteException;long div (long a, long b)java.rmi. RemoteException;}

Откомпилируем его при помощи компилятора Java:

>javac Calculator.java

Теперь напишем реализацию удаленной службы. Ниже приведен класс CalculatorImpl:

import java.rmi.*;java.rmi.server.*;class CalculatorImpl extends UnicastRemoteObject implements

{CalculatorImpl() throws java.rmi. RemoteException

{();

}long add (long a, long b)java.rmi. RemoteException

{ long res=a+b;res;

}long sub (long a, long b)java.rmi. RemoteException

{ long res=a-b;res;

}long mul (long a, long b)java.rmi. RemoteException

{ long res=a*b;res;

}long div (long a, long b)java.rmi. RemoteException

{ a/b;}}

Откомпилируем его.

>javac CalculatorImpl.java

Класс реализации использует UnicastRemoteObject для присоединения к системе RMI. В данном примере класс реализации непосредственно расширяет UnicastRemoteObject. Это не является обязательным требованием. Класс, не расширяющий UnicastRemoteObject, может использовать свой метод exportObject () для присоединения к RMI.

Если класс расширяет UnicastRemoteObject, он должен обеспечить конструктор, объявляющий, что он может сгенерировать объект RemoteException. Если этот конструктор вызывает метод super (), он активизирует код в UnicastRemoteObject, который выполняет RMI-соединение и инициализацию удаленного объекта.

Дальше мы используем компилятор RMI, rmic, для генерации файлов заглушки и скелета. Компилятор запускается с указанием файла класса, реализующего удаленную службу.

>rmic CalculatorImpl

Необходимо выполнить это в нашем каталоге. После запуска rmic мы должны найти файл Calculator_Stub. class.

Удаленные службы RMI должны быть помещены в процесс сервера. Класс CalculatorServer является очень простым сервером, предоставляющим простые элементы для размещения.

import java.rmi.Naming;class CalculatorServer

{CalculatorServer ()

{

{c = new CalculatorImpl();.rebind ("rmi://localhost:1099/CalculatorService", c);

}(Exception e) {.out.println ("Trouble: " + e);

}

}static void main (String args[])

{System.out.println("Server start succesfull");

new CalculatorServer();

}

}

В этом примере мы видим вызов статического метода Naming.rebind(). Однако этот вызов требует, чтобы регистрация была запущена отдельным процессом на вашем компьютере.

Как и многие другие сетевые программы, rmiregistry обращается по IP адресу машины, на которой она установлена, но она также слушает порт. Если вы вызовите rmiregistry как показано выше, без аргументов, будет использован порт по умолчанию 1099. Если вы хотите использовать другой порт, вы добавляете аргумент в командную строку, указывающий порт.

Информация о порте также должна передаваться в команде bind(), наряду с IP адресом машины, где располагается регистрация. Но это может выявить проблему, если вы хотите проверять RMI программы локально. В выпуске JDK 1.1.1, есть целая связка проблем:

) localhost не работает с RMI. Поэтому для экспериментов с RMI на одной машине вы должны использовать имя машины. Чтобы найти имя вашей машины под управлением 32-битной Windows, перейдите в панель управления и выберите «Network». Выберите закладку «Identification», и посмотрите имя вашего компьютера. Регистр в имени игнорируется. (Пример имени: «peppy»)

) RMI не работает, пока ваш компьютер имеет активные TCP/IP соединения, даже если все ваши компоненты просто общаются друг с другом на локальной машине. Это значит, что вы должны соединятся с вашим провайдером Internet до того, как попробуете запустить программу или будете огорчены неким сообщением об ошибке.

Если вы используете порт по умолчанию 1099, вам не нужно указывать порт, так что вы можете просто сказать:

Naming.bind (« //peppy/CalculatorService», с);

Вы можете выполнить локальную проверку, оставив в покое IP адрес, а использовать только идентификатор:

Naming.bind («CalculatorService», с);

Имя сервиса здесь произвольно. В данном случае CalculatorService выбрано просто как имя класса, но вы можете назвать так, как захотите. Важно, чтобы это было уникальное имя регистрации, чтобы клиент знал, когда будет искать, что производит удаленные объекты. Если имя уже зарегистрировано, вы получите AlreadyBoundException. Чтобы предотвратить это, вы всегда можете использовать rebind() вместо bind(), так как rebind() либо добавляет новый элемент, либо заменяет уже существующий.

Даже после завершения работы main(), ваш объект будет оставаться созданным и зарегистрированным, ожидая, что придет клиент и выполнит запрос. Пока rmiregistry остается запущенным, и вы не вызовите Naming.unbind() на вашей машине, объект будет оставаться там. По этой причине, когда вы разрабатываете ваш код, вам необходимо выгружать rmiregistry и перезапускать его, когда скомпилируете новую версию вашего удаленного объекта.

Вам не обязательно запускать rmiregistry как внешний процесс. Если вы знаете, что только ваше приложение использует регистрацию, вы можете загрузить ее внутри вашей программы с помощью строки:.createRegistry(2005);

Как и раньше, 2005 - это номер порта, который мы использовали в этом примере. Это эквивалентно запуску rmiregistry 2005 из командной строки, но часто этот способ является более подходящим при разработке RMI кода, так как это снжает число необходимых действий при запуске и остановке регистрации После того, как вы выполните этот код, вы можете вызвать bind(), используя Naming, как и ранее.

Исходный код клиента следующий:java.rmi. Naming;

import java.rmi. RemoteException;java.net. MalformedURLException;java.rmi. NotBoundException;class CalculatorClient

{static void main (String[] args)

{

{c = (Calculator).lookup ("rmi://localhost/CalculatorService");.out.println (c.sub (4, 3)); System.out.println (c.add (4, 5));.out.println (c.mul (3, 6)); System.out.println (c.div (9, 3));

}(MalformedURLException murle)

{.out.println();.out.println ("MalformedURLException");.out.println(murle);

}(RemoteException re)

{

System.out.println();.out.println("RemoteException");.out.println(re);

}(NotBoundException nbe)

{.out.println();.out.println("NotBoundException");.out.println(nbe);

}(java.lang.ArithmeticException ae)

{.out.println();.out.println("java.lang.ArithmeticException");.out.println(ae);

}

}

}


2.2 Работа с программой «Calculator»


Теперь мы готовы к запуску системы. Мы должны запустить три консоли, одну для сервера, одну для клиента и одну для реестра RMI.

Начните с реестра. Вы должны находиться в каталоге, в котором находятся написанные вами классы. Напишем следующее:

Rmiregistry


Рисунок 2.1 Запуск программы rmiregistry


Во второй консоли запустите сервер, содержащий CalculatorService, и наберите следующее:

>java CalculatorServer


Рисунок 2.2 Запуск сервера


В последней консоли запустите клиентскую программу.

>java CalculatorClient


Рисунок 2.3 Запуск клиента


Мы создали работающую систему RMI. Даже если вы запустили три консоли на одном и том же компьютере, RMI использует стек протоколов TCP/IP вашей сети для взаимодействия между тремя отдельными JVM. Это вполне законченная RMI-система.

Выводы


В ходе выполнения курсового проекта ознакомился с архитектурой java и java RMI.

В первой части проекта были закреплены сведения о архитектуре java, ее системы и характеристики, свойства языка.

Во второй части реализовано приложение Java RMI. Предоставлен пример данного приложения.

Выполнение работы способствовало повышению знаний и практических навыков в области распределенных компьютерных систем.

Список источников


1.Касаткин А.И. Профессиональное программирование на языке JAVA. Управление ресурсами: Справ. пособие. - Мн.: Выш. шк., 1992. - 432 с.: ил.

2.Рудаков П.И., Финогенов К.Г. Программируем на языке JAVA IBM PC: В 4-х частях. - М.: «Энтроп», 1995.

3.Джо Вебер, Технология Java. Наиболее полное руководство: Санкт-Петебург,1997.1104 с.: ил.


СОДЕРЖАНИЕ РЕФЕРАТ ТЕХНИЧЕСКОЕ ЗАДАНИЕ ВВЕДЕНИЕ 1 АРХИТЕКТУРА ЯЗЫКА JAVA .1 Java - объектно-ориентированный язык .2 Безопасность и виртуал

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ