Министерство образования
БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ
Кафедра экономической информатики
Лабораторная работа №1
Технология Java TM Remote Method Invocation (Java RMI)
Вариант 20(5)
Выполнила студент гр. 972303
Рушева М. В.
Проверил Тумаш Д. Е.
Минск, 2022
Задание
Клиент удаленно вызывает метод сервера, который может быть запущен на удаленном компьютере. На клиенте вводится строка. Сервер возвращает эту строку, но с гласными, замененными символом «*» клиенту, который выводит ее на экран.
Код приложения
RemoteInterface.java
import java.rmi.Remote; import java.rmi.RemoteException; public interface RemoteInterface extends Remote { String replaceAllVowelsWithStars(String str) throws RemoteException; }
Server.java
import java.rmi.AlreadyBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.rmi.server.UnicastRemoteObject; public class Server implements RemoteInterface { public static void main(String[] args) { Server server = new Server(); try { RemoteInterface stub = (RemoteInterface) UnicastRemoteObject.exportObject(server, 0); Registry registry = LocateRegistry.createRegistry(1097); registry.bind("task", stub); System.out.println("Server is ready"); } catch (RemoteException | AlreadyBoundException e) { e.printStackTrace(); } } @Override public String replaceAllVowelsWithStars(String str) { StringBuilder output = new StringBuilder(); for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u') { output.append('*'); } else { output.append(c); } } return output.toString(); } }
Client.java
import java.rmi.NotBoundException; import java.rmi.RemoteException; import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import java.util.Scanner; public class Client { private Client() { } public static void main(String[] args) { try { String host = (args.length < 1) ? "127.0.0.1" : args[0]; Scanner in = new Scanner(System.in); Registry registry = LocateRegistry.getRegistry(host, 1097); RemoteInterface stub = (RemoteInterface) registry.lookup("task"); System.out.print("Enter a string: "); String str = in.nextLine(); String response = stub.replaceAllVowelsWithStars(str); System.out.println("Response: " + response); } catch (RemoteException | NotBoundException e) { e.printStackTrace(); } } }
Используем следующие команды для запуска:
javac -d destDir RemoteInterface.java Server.java Client.java
java -classpath destDir Server
java -classpath destDir Client
Результаты выполнения программы:
Рисунок 1 – После запуска сервера
Рисунок 2 – После запуска клиента
Контрольные вопросы
В чем преимущество использование технологии RMI?
Преимущество RMI состоит в том, что нам не нужно самостоятельно писать какой-либо сетевой код или код ввода-вывода, а клиентская программа, вызывающая удаленные методы (то есть там, где находится реальная служба), аналогична вызовам обычных методов для объектов, работающих на собственной JVM клиента.
Из каких компонентов состоят приложения на основе RMI?
Из двух программ: сервера и клиента. Программа-сервер создаёт удалённые объекты, делает ссылки на эти объекты доступными и ожидает, пока клиенты не начнут вызывать методы этих объектов.
Какой пакет содержит интерфейсы и классы, ответственные за работу с удаленными объектами в системе RMI?
java.rmi.
Каким требованиям должен удовлетворять интерфейс удаленного класса?
1) удаленный интерфейс должен расширять интерфейс java.rmi.Remote.
2) каждое объявление метода в удаленном интерфейсе или его над-интерфейсах должно включать исключение java.rmi.RemoteException (или его суперклассы) в разделе throws вдобавок к остальным имеющимся исключениям.
3) в объявлении удаленного метода удаленный объект, объявленный как параметр или возвращаемое значение должен быть объявлен как удаленный интерфейс, а не реализация (implementation) класса того интерфейса.
Какие ситуации могут быть причиной возбуждения исключительной ситуации RemoteException?
Причины сбоя могут быть следующими:
Ошибка коммуникации (удаленный сервер недоступен или не может установить соединение)
Ошибка маршаллизации/демаршаллизации (упаковка/распаковка параметров)
Ошибки протокола
Каким требованиям должен удовлетворять класс, реализующий удаленный интерфейс?
Общие правила для класса, который реализует удаленный интерфейс:
Класс обычно расширяет java.rmi.server.UnicastRemoteObject
Класс может реализовывать любое количество удаленных интерфейсов
Класс может расширять другой удаленный класс
Класс может определять методы, которые не находятся на удаленном интерфейсе, но использовать их следует только локально.
Что такое стабы и скелетоны? Как работает стаб?
Стаб RMI использует стандартный механизм (внедренный в RPC-системы) для сообщения между удаленными объектами: стабы (stub) и скелетоны (skeleton). Стаб для удаленного объекта действует как локальный представитель на клиенте или прокси (proxy) для удаленного объекта. Вызывающий объект вызывает метод на локальном стабе, который ответственен за доставку вызова метода на удаленный объект. В RMI стаб для удаленного объекта реализует тот же самый набор удаленных интерфейсов, что и удаленный объект.
Какие изменения RMI-технологии имеются в J2SE 1.5 по сравнению с предыдущими версиями ОВЛ?
На удаленной JVM каждый удаленный объект может иметь соответствующий скелетон. Однако начиная с Java 1.2, скелетоны не обязательны.
Для чего предназначен и как работает метод LocateRegistry.getRegistry()?
Метод LocateRegistry.getRegistry () используется для получения ссылки на локальный реестр.
Как запустить регистратор с портом по умолчанию?
start rmiregistry