
- •JAVA-ТЕХНОЛОГИЯ
- •Remote Method Invocation
- •Недостатки RPC
- •Архитектура RMI
- •Схема RMI
- •Пример
- •Серверная часть.
- •Compute.java
- •Task.java
- •Реализация удаленного интерфейса
- •ComputeImpl.java
- •ComputeServer.java
- •ComputeServer.java
- •UnicastRemoteObject
- •UnicastRemoteObject
- •UnicastRemoteObject
- •Регистрация удаленных объектов
- •RMI registry
- •RMI-реестр
- •RMI-реестр
- •Менеджер безопасности
- •Передача объектов в RMI
- •Клиентская часть
- •Клиентская часть
- •ComputeClient.java
- •ComputeService
- •ComputeClient
- •Заглушки
- •Скелетные схемы
- •Компиляция и выполнение
- •Запуск RMI-клиента

Менеджер безопасности
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 |
|
|
|
|
|
|
u |
|
|
|
|
|
|
k |
|
|
|
|
|
|
o |
|
|
|
|
|
|
o |
|
|
|
|
|
|
l |
|
|
|
||
|
|
. |
|
|
|
|
|
|
g |
|
|
|
|
|
|
|
n |
|
|
|
|
|
|
|
i |
|
|
|
|
|
|
|
m |
|
|
|
|
|
|
a |
|
|
|
|
|
|
|
N |
|
|
|
|
|
|
|
ComputeClient
c o m p . e x e c u t e T a s k
rmiregistry
Naming.rebind
ComputeServer
(С) Сафонов В.О. 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