Вызов удаленного метода Java

редактировать
Типичная модель реализации Java-RMI с использованием заглушки и скелета объектов. Java 2 SDK, Standard Edition, v1.2 устраняет необходимость в каркасе.

В вычислениях, Java Remote Method Invocation (Java RMI ) - это Java API, который выполняет вызов удаленного метода, объектно-ориентированный эквивалент вызовов удаленных процедур (RPC), с поддержкой прямая передача сериализованных классов Java и распределенной сборки мусора.

Исходная реализация зависит от механизмов представления классов виртуальной машины Java (JVM) и, таким образом, поддерживает только создание звонки от одной JVM к другой. Протокол, лежащий в основе этой реализации только для Java, известен как (JRMP). Для поддержки кода, работающего в контексте, отличном от JVM, программисты позже разработали версию CORBA.

Использование термина RMI может обозначать исключительно программный интерфейс или может обозначать как API, так и IIOP или другую реализацию, тогда как термин RMI -IIOP (читай: RMI поверх IIOP ) конкретно обозначает интерфейс RMI, делегирующий большую часть функциональности поддерживающей реализации CORBA.

Основная идея Java RMI, протокола распределенной сборки мусора (DGC) и большая часть архитектуры, лежащей в основе оригинальной реализации Sun, исходят из функции «сетевых объектов» Modula-3.

Содержание

  • 1 Обобщенный код
  • 2 Версия Jini
  • 3 Пример
  • 4 Ссылки
  • 5 Внешние ссылки

Обобщенный код

Программисты оригинального RMI API обобщили код в некоторой степени поддерживает различные реализации, такие как транспорт HTTP. Кроме того, возможность передавать аргументы «по значению » была добавлена ​​в CORBA для обеспечения совместимости с интерфейсом RMI. Тем не менее, реализации RMI-IIOP и JRMP не имеют полностью идентичных интерфейсов.

Функциональность RMI входит в пакет java.rmi , тогда как большая часть реализации Sun находится в пакете sun.rmi. Обратите внимание, что в версиях Java до Java 5.0 разработчикам приходилось компилировать заглушки RMI на отдельном этапе компиляции с использованием rmic. Версия 5.0 Java и выше больше не требует этого шага.

Версия Jini

Jini предлагает более продвинутую версию RMI на Java. Он функционирует аналогично, но обеспечивает более продвинутую безопасность, возможности обнаружения объектов и другие механизмы для приложений с распределенными объектами.

Пример

Следующие классы реализуют простую клиент-серверную программу с использованием RMI, которая отображает сообщение.

RmiServerclass - слушает запросы RMI и реализует интерфейс, который используется клиентом для вызова удаленных методов.

импортировать java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import java.rmi.registry. *; открытый класс RmiServer расширяет UnicastRemoteObject, реализует RmiServerIntf {общедоступный статический финальный String MESSAGE = "Hello World"; public RmiServer () выбрасывает RemoteException {super (0); // требуется, чтобы избежать шага rmic, см. ниже} public String getMessage () {return MESSAGE; } public static void main (String args) выдает исключение {System.out.println ("RMI-сервер запущен"); try {// специальный обработчик исключений для создания реестра LocateRegistry.createRegistry (1099); System.out.println ("Реестр Java RMI создан."); } catch (RemoteException e) {// ничего не делаем, ошибка означает, что реестр уже существует System.out.println («java RMI registry уже существует.»); } // Создание экземпляра RmiServer RmiServer server = new RmiServer (); // Привязать этот экземпляр объекта к имени «RmiServer» Naming.rebind («// localhost / RmiServer», server); System.out.println ("PeerServer привязан к реестру"); }}

RmiServerIntfinterface - определяет интерфейс, который используется клиентом и реализуется сервером.

импортировать java.rmi.Remote; import java.rmi.RemoteException; открытый интерфейс RmiServerIntf extends Remote {String getMessage () выбрасывает RemoteException; }

RmiClientclass - это клиент, который получает ссылку (прокси) на удаленный объект, живущий на сервере, и вызывает свой метод для получения сообщения. Если бы объект сервера реализовал java.io.Serializable вместо java.rmi.Remote, он был бы сериализован и передан клиенту в качестве значения.

import java.rmi.Naming; открытый класс RmiClient {public static void main (String args) выдает исключение {RmiServerIntf server = (RmiServerIntf) Naming.lookup ("// localhost / RmiServer"); System.out.println (server.getMessage ()); }}

Перед запуском этого примера нам нужно создать «заглушку» для интерфейса, который мы использовали. Для этой задачи у нас есть компилятор RMI - 'rmic'

  • Примечание: мы делаем файл-заглушку из файла '*.class' с реализацией удаленного интерфейса, а не из файла '*.java'.
rmic RmiServer

Обратите внимание, что начиная с версии 5.0 J2SE была добавлена ​​поддержка динамически генерируемых файлов-заглушек, а rmic предоставляется только для обратной совместимости с более ранними средами выполнения или для программ, которые не предоставляют явный номер порта (или ноль) при экспорте удаленных объектов, что требуется для возможности создания заглушек, как описано в документации Javadoc для UnicastRemoteObject. См. Комментарий в конструкторе выше.

Ссылки

Внешние ссылки

Последняя правка сделана 2021-05-24 03:57:59
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте