Слайд 1
Виклик віддалених МЕТОДІВ
Лекція 11
доц.кафедри Інформатики Сінельнікова Т.Ф.
Слайд 2ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Зміст
RMI-Технологія
Просте RMI-Додаток клієнт-сервер
Крок 1. Введіть і компілюйте
вихідний код
Крок 2. Генерує заглушки і скелети
Крок 3. Встановіть файли
на машинах сервера і клієнта
Крок 4. Запустіть RMI-Реєстр на машині сервера
Крок 5. Запустіть сервер
Крок 6. Запустіть клієнта
Слайд 3ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
RMI-Технологія
Виклик віддалених методів (RMI,Remote Method Invocation) Дозволяє
Java-Об'єкту, який виконується на одній машині, викликати метод об'єкта Java,
Що виконується на іншій машині.
Ця властивість є важливим через те, що дозволяє будувати розподілені додатки.
Слайд 4ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Просте RMI-Додаток клієнт-сервер
Ця програма використовує чотири вихідних
файлу.
Слайд 5ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 1. Введіть і компілюйте вихідний код
Перший
файл, AddServerIntf.java, Визначає віддалений інтерфейс, який забезпечується сервером. Він містить
один метод, який приймає два параметри і повертає їх суму. Всі вилучені інтерфейси повинні розширювати Remote-Інтерфейс, який є частиною java.rmi.Remote не визначає жодних членів. Його мета - просто вказати, що інтерфейс використовує віддалені методи. Всі вилучені методи можуть викидати винятку RemoteException.
import java.rmi. *;
public interface AddServerlntf extends Remote {
double add (double d1, double d2) throws RemoteException;}
Слайд 6ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 1. Введіть і компілюйте вихідний код
Другий
вихідний файл, AddServerImpl.java, Реалізує віддалений інтерфейс. Реалізація методу add ()
- Пряма. Всі віддалені об'єкти повинні розширювати unicastRemoteObject, Який забезпечує функціональні можливості об'єктів на віддалених машинах. (В даний час підтримується лише односпрямовані (unicast) Сервери, т. е. RMI не підтримує конфігурацій, що включають реплікованих сервери.)
import java.rmi. *; import java.rmi.server. *;
public class AddServerImpl extends UnicastRemoteObject implements AddServerlntf {
public AddServerimpl () throws RemoteException { }
public double add (double d1, double d2) throws RemoteException {return d1 +d2;}}
Слайд 7ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 1. Введіть і компілюйте вихідний код
Третій
вихідний файл, AddServer.Java, Містить програму main() Для машини
сервера. Її первинна функція повинна оновити RMI-Реєстр на цій машині. Це робиться за допомогою методу rebind () класу Naming (З java.rmi). Зазначений метод пов'язує ім'я з об'єктної посиланням. Перший аргумент методу - рядок, який іменує сервер як "AddServer". Його другий аргумент - посилання на екземпляр AddServerImpi.
import java.net. *; import java.rmi. *;
public class AddServer (
public static void main (String args []) {try {
AddServerimpi addServerlmpl = new AddServerImpi (); Naming.rebindl "AddServer", addServerlmpl);)
catch(Exception e) {System.out.println ("Exception:" + e);}
}}
Слайд 8ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 1. Введіть і компілюйте вихідний код
Четвертий
вихідний файл, Addclient. java, реалізує сторону клієнта цього розподіленого додатка.
Addciient.java вимагає трьох параметрів командного рядка. Перший - IP-Адреса або ім'я машини сервера. Другий і третій параметри - два числа, які потрібно підсумувати.
Слайд 9ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 1. Введіть і компілюйте вихідний код
Після
введення всього коду використовуйте Java-Компілятор (Javac), щоб компілювати чотири вихідних
файлу, які ви створили.
Слайд 10ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 1. Введіть і компілюйте вихідний код
Додаток
починається з формування рядка, який слід синтаксису URL. Цей URL
використовує протокол rmi. Рядок включає IP-Адреса або ім'я сервера і рядок "AddServer". Потім програма викликає метод lookup про класу Naming. Цей метод приймає один аргумент, rmi URL, і повертає посилання на об'єкт типу AddServerintf. Всі віддалені виклики методів можна направити до цього об'єкта.
Слайд 11ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 1. Введіть і компілюйте вихідний код
Програма
триває відображенням її параметрів і потім викликає віддалений метод add(),
Який повертає і потім роздруковує суму чисел.
import j ava.rmi. *; public class AddClient {
public static void main (String args [])
{ try {
String addServerURL = "rmi :/ /" + args [0] + "/ AddServer"; AddServerintf addServerlntf =
(AddServerintf) Naming.lookup (addServerURL); System.out.println ("The first number is:" + args [l]); double dl = Double.valueOf (args [1]). DoubleValue (); System.out . println ("The second number is:" + args [2]);
double d2 = Double.valueOf (args [2]). doubleValue (); System.out.println ("The sum is:" + addServerlntf.add (dl, d2));} catch (Exception e) {
System.out.println ("Exception:" + e);}}} "
Слайд 12ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 2. Генерує заглушки і скелети
Перед використанням
клієнта і сервера потрібно згенерувати необхідну заглушку, а також кістякову
схему.
У контексті RMI заглушка (stub) - це Java-Об'єкт, який постійно перебуває на машині клієнта. Його функція полягає в поданні тих же інтерфейсів, що і на віддаленому сервері. Виклики віддаленого методу, ініційовані клієнтом, фактично спрямовуються до заглушки. Заглушка працює з іншими частинами RMI системи для формулювання запиту, який надсилається до віддаленої машині.
Слайд 13ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 2. Генерує заглушки і скелети
Віддалений метод
може приймати параметри, які є простими типами або об'єктами. В
останньому випадку об'єкт може мати посилання до інших об'єктів. Вся ця інформація повинна бути відправлена віддаленій машині. Об'єкт, який передається як параметр виклику віддаленого методу, повинен бути серіалізовать (перетворений в послідовну форму) і посланий на віддалену машину.
Скелетні схеми (скелети) в Java 2 не використовуються. Однак вони потрібні для RMI моделі Java 1.1.
Скелет (skelton) - Це об'єкт Java, Який постійно перебуває на машині сервера. Він працює з іншими частинами RMI системи Java 1.1, щоб приймати запити, виконувати десеріалізацію і викликати відповідний код на сервері.
Слайд 14ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 2. Генерує заглушки і скелети
Якщо клієнтові
повинен бути повернений відповідь, виконується зворотний процес. Зверніть увагу, що
якщо об'єкти повертаються клієнтові, то кошти сериализации і десеріалізациі теж використовуються.
Щоб генерувати заглушки і скелети, потрібно використовувати інструмент, званий компілятором RMI,який викликається з командного рядка так:
rmic AddServerlmpl
Дана Команда Генерує два нові файлу: AddServerlmpLSkel.class (Скелет) і AddServerimpLStub.class (Заглушка).
При використанні rmic переконайтеся, що CLASSPATH включає поточний каталог. За замовчуванням rmic генерує як заглушку, так і скелетний файл.
Слайд 15ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 3. Встановіть файли на машинах сервера
і клієнта
Скопіюйте AddClient.class,AddServerImpl_Stub.class іAddServerlntf.class в каталог на машині клієнта,
AddServerlntf
.class, AddServerlmpl.class, AddServerImpl_Skel.class, AddServerImpl__Stub.class і AddServer.class - В каталог на машині сервера.
Слайд 16ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 4. Запустіть RMI-Реєстр на машині сервера
JDK
забезпечує програму, яка називається rmiregistry, Яка виконується на машині сервера.
Вона відображає імена об'єктних посилань. Спочатку, перевірте, щоб мінлива середовища CLASSPATH включала каталог, в якому розташовані ваші файли. Потім запустіть RMI-Реєстр з командного рядка:
start rmiregistry
Коли ця команда поверне управління, ви повинні побачити, що було створено нове вікно. Поки ви виконуєте експерименти з RMI-Прикладом, потрібно залишити це вікно відкритим.
Слайд 17ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 5. Запустіть сервер
Програма сервера запускається наступного
командним рядком:
Java AddServer
Нагадаємо, що програма AddServer створює екземпляр AddserverImpl
і реєструє цей об'єкт з ім'ям "AddServer".
Слайд 18ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 6. Запустіть клієнта
Програмне забезпечення Addclient вимагає
три параметри: ім'я або IP-Адресу машини сервера і два числа,
які повинні бути підсумовані. Ви можете викликати його з командного рядка, використовуючи один з двох форматів:
Java AddClient serverl 8 вересень Java AddClient 11.12.13.14 8 вересня
У першому рядку вказується ім'я сервера.
Другий рядок використовує його IP-Адресу (11. 12.13.14).
Слайд 19ХНУРЕ, Кафедра Інформатики
e-mail: informatika@kture.kharkov.ua
Крок 6. Запустіть клієнта
Ви можете перевірити даний
приклад, не маючи віддаленого сервера. Щоб зробити це, просто встановіть
всі програми на тій же самій машині, запустіть rmiregistry, Потім запустіть AddSever І потім - AddClient, Використовуючи наступну командний рядок:
Java AddClient 127.0.0.1 8 9
Тут, адреса 127.0.0.1 - це адреса "зворотної петлі" для локальної машини. Використання цієї адреси дозволяє здійснювати повний RMI-Механізм без фактичної необхідності установки сервера на віддаленому комп'ютері.
У будь-якому випадку приклад виведення цієї програми виглядає так:
The first number is: 8 The second number is: 9 The sum is: IV