java23-nesortirovannoe (java23 ([НЕСОРТИРОВАННОЕ]))

2016-10-15СтудИзба

Описание презентации

Презентация из архива "java23 ([НЕСОРТИРОВАННОЕ])", который расположен в категории "". Всё это находится в предмете "прочее" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "рефераты, доклады и презентации", в предмете "прочее" в общих файлах.

Просмотр презентации онлайн

Текст из слайда

JAVA-ТЕХНОЛОГИЯ
Сафонов Владимир Олегович
Профессор кафедры информатики,
руководитель лаборатории Javaтехнологии
(http://polyhimnie.math.spbu.ru/jtl)
Email: vosafonov@gmail.com
Лекция 23
Удаленные вызовы методов в Java:
Remote Method Invocation (JNI)

Remote Method Invocation



Технология RMI, впервые представленная в
JDK 1.1, позволяет Java-объекту, который
выполняется на одной машине, вызвать метод
объекта, выполняемый на другой машине.
Данная возможность играет
фундаментальную роль для разработки
распределенных Java-приложений
Идея технологии RMI основана на более
ранней технологии RPC (Remote Procedure Call)
для процедурного программирования,
разработанной фирмой Sun в 1980-х гг.
(С) Сафонов В.О. 2013

Недостатки RPC


RPC поддерживает ограниченный набор
простых типов данных.
Программисту необходимо знать специальный
язык определения интерфейса (IDL) для
описания функций, которые допускают
удаленный вызов.
(С) Сафонов В.О. 2013

Архитектура RMI


Архитектура RMI основана на принципе
разделения определений поведения и его
реализации
Данный принцип соответствует требованиям
распределенных систем, в которых клиентам
известны лишь определения сервисов, а
серверы реализуют и предоставляют данные
сервисы (SOA)
Клиентское
приложение
Интерфейс
запрос
Серверное
приложение
результат
(С) Сафонов В.О. 2013
Реализация

Схема RMI



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

Пример

Простое клиент-серверное приложение: Сервер
вычислителя принимает задачи от клиентов,
выполняет эти задачи и возвращает результаты

Сервер включает в себя интерфейс и класс

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

Серверная часть.
1. Определение удаленного
интерфейса




Удаленный интерфейс должен быть
общедоступным – public
Удаленный метод должен быть объявлен в
интерфейсе, который расширяет
java.rmi.Remote
Remote представляет собой интерфейс-маркер
– он не объявляет каких-либо методов,
поэтому не обременен реализацией класса
Все удаленные методы могут генерировать
исключения класса RemoteException
(С) Сафонов В.О. 2013

Compute.java
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface Compute extends Remote {
Object executeTask( Task t) throws
RemoteException;
}
RemoteException является контролируемым
исключением и бросается в результате какоголибо сбоя( неполадки сети и т.п. ).
(С) Сафонов В.О. 2013

Task.java


Второй интерфейс, необходимый для вычислителя,
определяет тип Task.
Этот тип используется как аргумент метода
executeTask в интерфейсе Compute.
import java.io.Serializable;
public interface Task extends Serializable {
Object execute();
}
RMI использует механизм сериализации объектов
для транспортировки объектов между разными JVM.
(С) Сафонов В.О. 2013

Реализация удаленного
интерфейса
Серверу необходимо создавать и инсталлировать
удаленные объекты

Эта процедура установки может быть
инкапсулирована в методе main() в самом классе,
реализующем удаленный объект, или может быть
включена в совершенно другой класс. Процедура
установки должна:


Создать и инсталлировать менеджер безопасности.

Создать один или более экземпляров удаленного
объекта.

Зарегистрировать как минимум один из удаленных
объектов в регистре RMI (или в другом сервисе
именования, таком, как JNDI), для самозагрузки.
(С) Сафонов В.О. 2013

ComputeImpl.java
import java.rmi.*;
import java.rmi.server.*;
public class ComputeImpl
extends UnicastRemoteObject
implements Compute {
public ComputeImpl() throws RemoteException { super();
}
public Object executeTask( Task t) {
return t.execute();
}
}
(С) Сафонов В.О. 2013

ComputeServer.java
import java.rmi.*;
import java.rmi.registry.*;
public class ComputeServer {
public ComputeServer() {
System.setSecurityManager(new
RMISecurityManager());
String name = “ComputeService";
try {
Compute compImpl = new ComputeImpl();
LocateRegistry.createRegistry(1099);
Naming.rebind(name, compImpl);
System.out.println("ComputeServer bound");
(С) Сафонов В.О. 2013

ComputeServer.java
} catch (Exception e) {
System.err.println
("ComputeEngine exception: " +
e.getMessage());
e.printStackTrace();
}
}
public static void main(String[] args) {
new ComputeServer();
}
}
(С) Сафонов В.О. 2013

UnicastRemoteObject

UnicastRemoteObject - удобный класс, определенный
в RMI API, который может использоваться как
суперкласс для реализаций удаленного объекта.

UnicastRemoteObject включает в себя конструкторы и
статические методы, используемые для экспорта
(exportObject()) удаленных объектов.

Конструкторы и методы UnicastRemoteObject бросают
исключение RemoteException, поэтому все его
подклассы должны определять конструкторы,
которые также генерируют это исключение.
(С) Сафонов В.О. 2013

UnicastRemoteObject

Экспортированный объект становится доступным для
прослушивания поступающих от клиентов запросов на
порту по умолчанию

Можно указать определенный порт для приема
запросов : exportObject( Remote obj, int port) . При этом
в URL удаленного объекта необходимо указать этот
порт : //host:port/objectname .

Замечание: порт по умолчанию – 1099.

Расширение UnicastRemoteObject класса
ComputeEngine может быть использовано для
создания простого удаленного объекта, который
поддерживает однонаправленную удаленную связь и
который использует принимаемую по умолчанию
сокетную транспортную службу RMI для
(С) Сафонов В.О. 2013
коммуникаций.

UnicastRemoteObject

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

Можно выбрать расширение из класса JDK
java.rmi.activation.Activatable (используемого для
конструирования удаленных объектов, которые
могут выполняться по требованию) .

В обоих случаях необходимо экспортировать объект
явным вызовом из конструктора удаленного
объекта (или из другого метода инициализации) .
(С) Сафонов В.О. 2013

Регистрация удаленных объектов





Вызов статического метода Naming.bind( ) требует,
чтобы регистрация была запущена отдельным
процессом на компьютере сервера. Имя сервера
регистрации - rmiregistry.
Для Win32 используется команда start rmiregistry для
запуска сервера в фоновом режиме.
Замечание: Для UNIX аналогичная команда:
rmiregistry &
Если вызвать rmiregistry, как показано выше, без
аргументов, будет использован порт по умолчанию
1099. Для использования другого порта добавляют
аргумент – номер порта.
Пример: rmiregistry 2010
rmiregistry 2010 & (для UNIX)
(С) Сафонов В.О. 2013

RMI registry




Не обязательно запускать rmiregistry как внешний
процесс. Если Вы знаете, что только Ваше
приложение использует регистрацию, Вы можете
загрузить ее внутри вашей программы с помощью
строки:
LocateRegistry.createRegistry( 2010 )
Это эквивалентно запуску rmiregistry 2010 из
командной строки, но часто этот способ является
более подходящим при разработке RMI-кода, так
как это снижает число необходимых действий при
запуске и остановке регистрации.
Пока rmiregistry остается запущенным, и Вы не
вызовете Naming.unbind( ) на вашей машине,
объект будет сохраняться там
Замечание: При запуске rmiregistry переменная
CLASSPATH должна содержать ссылку на
директорию, где находятся
файлы сервера.
(С) Сафонов В.О. 2013

RMI-реестр




java.rmi.Naming – API для связывания, регистрации и
поиска удаленных объектов в реестре.
Метод rebind() класса Naming (из java.rmi) обновляет
RMI-реестр(сервис имен удаленных объектов) на
машине сервера.
Сервер вызывает реестр для того, чтобы связать имя с
удаленным объектом. Клиент ищет удаленный объект
по его имени в реестре сервера, а затем вызывает его
метод.
Замечание: Программисты чаще используют rebind,
поскольку он гарантирует, что если объект уже был
зарегистрирован под заданным именем, новый
удаленный объект заменит ранее зарегистрированный
объект. Это может быть важно, если регистрируется
новая версия удаленного объекта.
(С) Сафонов В.О. 2013

RMI-реестр



Вызов rebind() может приводить к генерации
RemoteException, так что должно обрабатываться
данное исключение (в try-catch блоке)
Если имя уже зарегистрировано и вызывается метод
bind(), будет брошено AlreadyBoundException
Нет необходимости иметь поток, ожидающий в
течение всего времени жизни сервера. Пока на
другой виртуальной машине имеется ссылка на
объект ComputeImpl, объект ComputeImpl не будет
уничтожен или отправлен в "мусор".
(С) Сафонов В.О. 2013

Менеджер безопасности




ComputeServer использует менеджер безопасности,
поставляемый как часть системы RMI,RMISecurityManager.
Менеджер безопасности защищает системные
ресурсы от выполнения на виртуальной машине
непроверенных "скачанных" кодов.
Менеджер безопасности определяет, имеют ли
"скачанные" коды доступ к локальной файловой
системе и могут ли они выполнять другие
привилегированные операции.
RMISecurityManager реализует политику
безопасности (sandbox), похожую на типовую
политику для апплетов, то есть он консервативен в
разрешении доступа.
(С) Сафонов В.О. 2013

Передача объектов в RMI



Любая сущность любого типа может быть передана в
удаленный метод или из него, если эта сущность
является экземпляром типа, который является
примитивным типом, удаленным объектом или
сериализуемым объектом (он должен реализовать
интерфейс java.io.Serializable)
Удаленные объекты, в сущности, передаются по
ссылкам. Ссылка на удаленный объект - это заглушка,
являющаяся его представителем на клиентской стороне,
которая реализует полный набор удаленных
интерфейсов, реализуемых удаленным объектом.
Локальные объекты передаются копией, с
использованием сериализации объектов. По умолчанию
копируются все поля, кроме тех, которые отмечены static
или transient.
(С) Сафонов В.О. 2013

Клиентская часть

Клиент должен не только вызвать сервер, но и
определить задачу Task для вычислителя (то есть
реализовать интерфейс Task)

Рассматриваемая задача состоит в том, что клиент
делает запрос, передавая два числа, а сервер
возвращает их сумму
public class Sum implements Task {
private double m_a1;
private double m_a2;
(С) Сафонов В.О. 2013

Клиентская часть
public Sum( double p_a1, double p_a2) {
m_a1 = p_a1;
m_a2 = p_a2;
}
public Object execute() {
return (Double)(m_a1 + m_a2);
}
}
Следующий шаг – создание самого клиента.
Самое важное в этом коде - это поиск и получение
удаленного интерфейса с сервера.
(С) Сафонов В.О. 2013

ComputeClient.java
import java.rmi.*;
public class ComputeSum {
public static void main( String[] args) {
try {
String serverURL=“rmi://” + args[0] +
“/ComputeService”;
Compute comp =
(Compute)Naming.lookup(ServerURL);
(С) Сафонов В.О. 2013

ComputeService
double d1 = Double.valueOf(args[1]).doubleValue();
double d2 = Double.valueOf(args[2]).doubleValue();
Sum sum = new Sum( args[1], args[2] );
System.out.println(comp.executeTask(sum));
} catch (Exception e) {
System.err.println("ComputeSum exception: " +
e.getMessage());
e.printStackTrace();
}
}
}
(С) Сафонов В.О. 2013

ComputeClient

ComputeClient принимает 3 параметра командной
строки: IP-адрес или имя машины сервера и два
числа, которые нужно сложить.

Далее формируется URL-адрес, который начинается с
“rmi://”. Этот адрес содержит адрес машины сервера
и имя удаленного объекта.

Клиент использует метод Naming.lookup() для поиска
удаленного объекта по имени в реестре сервера(имя
удаленного объекта было связано с ним командой
rebind() ).

lookup() возвращает ссылку на удаленный объект (на
самом деле это ссылка на заглушку, которая
“скачивается” на машину
клиента).
(С) Сафонов В.О. 2013

p
in
g.
lo
ok
u
N
am
rmiregistry
ComputeClient
co
m
p.
Naming.rebind
ex
ec
ut
ComputeServer
eT
as
k
(С) Сафонов В.О. 2013

Заглушки

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

Объекты-заглушки принимают удаленные вызовы
метода и передают эти вызовы RMI, который
выполняет сетевые соединения, позволяющие
клиентам взаимодействовать с удаленным объектом
(С) Сафонов В.О. 2013

Скелетные схемы

Скелетные схемы в Java 2 и выше не используются.
Однако они требуются для RMI модели Java 1.1.
Поэтому скелеты требуются для совместимости
между Java 1.1 и Java 2.

Скелет – это объект Java, который постоянно
находится на машине сервера. Он работает с
другими частями RMI системы Java 1.1, чтобы
принимать запросы, выполнять десериализацию и
вызывать соответствующий код на сервере.

Замечание: Для кода Java 2 не требуется не только
скелетный механизм, но и совместимость с Java 1.1.
(С) Сафонов В.О. 2013

Компиляция и выполнение
программы

Самый простой случай – когда все файлы лежат в
одном каталоге (установим перед компиляцией
переменную CLASSPATH на наш каталог)

1. Компиляция всех файлов.(javac …)

2. Создание заглушек и скелетов:
rmic ComputeImpl

3. Запускаем сервер регистрации(в нашем примере
этого не требуется – у нас сервер регистрации
запускается из программы):
start rmiregistry

4. Запуск сервера:
java ComputeServer
(С) Сафонов В.О. 2013

Запуск RMI-клиента

Запуск клиента(с тремя параметрами – для нашей
задачи) :
java ComputeClient 127.0.0.1 3 5

Результат:
 ComputeServer bound
(в окне где запущен сервер)
 8.0
(в окне где запущен клиент – сумма введенных
чисел)
(С) Сафонов В.О. 2013

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Нашёл ошибку?
Или хочешь предложить что-то улучшить на этой странице? Напиши об этом и получи бонус!
Бонус рассчитывается индивидуально в каждом случае и может быть в виде баллов или бесплатной услуги от студизбы.
Предложить исправление
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5140
Авторов
на СтудИзбе
441
Средний доход
с одного платного файла
Обучение Подробнее