- •Лекция 12
- •Клиент-сервер
- •Использование proxy (представителей)
- •Технологии
- •Технология RMI
- •Классы-заглушки (stubs)
- •Использование proxy (представителей)
- •Удаленные объекты
- •Интерфейсы и их реализации
- •Определение удаленных объектов
- •Определение удаленных объектов
- •Диаграмма наследования классов
- •Соглашения именования RMI
- •Поиск объекта-сервера
- •Программа-сервер
- •Программа-сервер (продолжение)
- •Запуск сервера
- •Запуск программы клиента
- •Программный код на стороне клиента
- •Программный код на стороне клиента (продолжение)
- •Файл политики безопасности
- •Последовательность действий для запуска программ
- •Использование proxy (представителей)
Определение удаленных объектов
public ProductImpl(String d) throws RemoteException
{
descr = d;
}
public String getDescription() throws RemoteException
{
return "I am a " + secr + ". Buy me!";
}
}
Диаграмма наследования классов
Object
Remote
RemoteObject
RemoteStub |
|
RemoteServer |
|
|
|
UnicastRemoteObject
Соглашения именования RMI
Без суффикса (напр. Product)
Суффикс Impl (ProductImpl)
Суффикс Server
Суффикс Client
Суффикс Stub
Суффикс Skel
Удаленный интерфейс
Класс-сервер, реализующий этот интерфейс
Программа-сервер, создающая объекты- серверы
Программа-клиент, вызывающая удаленные методы
Класс-заглушка (до JDK 5.0)
Класс-структура (до JDK 5.0)
Поиск объекта-сервера
Для организации доступа к объекту серверу, надо получить ссылку локальный на объект- заглушку.
Сервер:
ProducImpl p1 = new ProductImpl("Toaster"); Context namingContext = new InitialContext(); namingContext.bind("rmi:toaster", p1);
Клиент:
Product p = (Product) namingContext.lookup("rmi://yourserber.com/ toaster");
Программа-сервер
public class ProductServer
{
public static void main(String args[])
{
try
{
ProductImpl p1 = new ProductImpl("Toaster");
ProductImpl p2 = new
ProductImpl("Microware Oven");
Программа-сервер (продолжение)
Context namingContext = new
InitialContext();
namingContext.bind("rmi:toaster",p1);
namingContext.bind("rmi:microwave",
p2);
} catch (Exception e) { e.printStackTrace();
}
}
}
Запуск сервера
Для запуска программы сервер необходимо предварительно запустить программу rmiregistry
Программа-сервер не завершает работу по окончанию регистрации объектов
Запуск программы клиента
Перед запуском программы-клиента необходимо проверить правильность регистрации удаленных объектов.
try {
Context namingContext = new InitialContext(); NamingEnumeration<NameClassPair> e =
namingContext.list("rmi:"); while (e.hasMore()) {
System.out.println(e.next().getName());
}
} catch (Exception e) { e.printStackTrace();
Программный код на стороне клиента
Если классы-заглушки не устанолвнеы локально на стороне клиента, необходимо установить диспетчера защиты:
System.setSecurityManager(new
RMISecurityManager());
Пример программы клиента:
public class ProductClient {
public static void main(String[] args)
{
System.setProperty("java.security.policy",
client.policy");
Программный код на стороне клиента (продолжение)
System.setSecurityManager(
new RMISecurityManager()); String url = "rmi://localhost/"; try {
Context namingContext = new InitialContext();
Product c1 = (Product) namingContext
.lookup(url + "toaster");
Product c2 = (Product) namingContext
.lookup(url + "microwave"); System.out.println(c1.getDescription()); System.out.println(c2.getDescription());
} catch (Exception e) {
e.printStackTrace();
}