WikiDer > Вызов удаленного метода Java
В вычисление, то Вызов удаленного метода Java (Java RMI) это Ява API который выполняет вызов удаленного метода, объектно-ориентированный эквивалент вызовы удаленных процедур (RPC), с поддержкой прямой передачи сериализованный Классы Java и распределенный сборщик мусора.
Исходная реализация зависит от Виртуальная машина Java (JVM) механизмы представления классов, поэтому он поддерживает только вызовы от одной JVM к другой. Протокол, лежащий в основе этой реализации только для Java, известен как Протокол удаленного метода Java (JRMP). Чтобы поддерживать код, работающий в контексте, отличном от JVM, программисты позже разработали CORBA версия.
Использование термина RMI может обозначать исключительно программный интерфейс или может обозначать как API, так и JRMP, IIOP, или другая реализация, тогда как термин RMI-IIOP (читайте: RMI over IIOP) специально обозначает интерфейс RMI, делегирующий большую часть функций вспомогательной CORBA выполнение.
Основная идея Java RMI, протокола распределенной сборки мусора (DGC) и большая часть архитектуры, лежащей в основе исходной реализации Sun, исходят из функции «сетевых объектов» Модула-3.
Обобщенный код
Программисты исходного RMI API несколько обобщили код для поддержки различных реализаций, таких как HTTP транспорт. Кроме того, возможность передавать аргументы "по стоимости"был добавлен в CORBA для обеспечения совместимости с интерфейсом RMI. Тем не менее, реализации RMI-IIOP и JRMP не имеют полностью идентичных интерфейсов.
Функциональность RMI входит в комплект java.rmi
, в то время как большая часть реализации Sun находится в sun.rmi
упаковка. Обратите внимание, что в версиях Java до Java 5.0 разработчикам приходилось компилировать заглушки RMI на отдельном этапе компиляции, используя rmic
. Версия 5.0 Java и выше больше не требует этого шага.
Версия Jini
Джини предлагает более продвинутую версию RMI на Java. Он работает аналогично, но обеспечивает более продвинутую безопасность, возможности обнаружения объектов и другие механизмы для приложений с распределенными объектами.[1]
Пример
Следующие классы реализуют простую клиент-серверную программу с использованием RMI, которая отображает сообщение.
RmiServer
учебный класс - слушает запросы RMI и реализует интерфейс, который используется клиентом для вызова удаленных методов.
импорт java.rmi.Naming;импорт java.rmi.RemoteException;импорт java.rmi.server.UnicastRemoteObject;импорт java.rmi.registry. *;общественный учебный класс RmiServer расширяет UnicastRemoteObject орудия RmiServerIntf { общественный статический окончательный Нить СООБЩЕНИЕ = "Привет, мир"; общественный RmiServer() бросает RemoteException { супер(0); // требуется, чтобы избежать шага rmic, см. ниже } общественный Нить getMessage() { возвращаться СООБЩЕНИЕ; } общественный статический пустота главный(Нить аргументы[]) бросает Исключение { Система.из.println("Сервер RMI запущен"); пытаться { // специальный обработчик исключений для создания реестра Найдите Реестр.createRegistry(1099); Система.из.println("Реестр java RMI создан".); } ловить (RemoteException е) { // ничего не делаем, ошибка означает, что реестр уже существует Система.из.println(«Реестр Java RMI уже существует».); } // Создание экземпляра RmiServer RmiServer сервер = новый RmiServer(); // Связываем этот экземпляр объекта с именем "RmiServer" Именование.переплетать("// localhost / RmiServer", сервер); Система.из.println(«PeerServer привязан к реестру»); }}
RmiServerIntf
интерфейс - определяет интерфейс, который используется клиентом и реализуется сервером.
импорт java.rmi.Remote;импорт java.rmi.RemoteException;общественный интерфейс RmiServerIntf расширяет Удаленный { Нить getMessage() бросает RemoteException;}
RmiClient
учебный класс - это клиент, который получает ссылку (прокси) на удаленный объект, живущий на сервере, и вызывает его метод для получения сообщения. Если бы объект сервера реализовал java.io.Serializable вместо java.rmi.Remote, он был бы сериализован и передан клиенту в качестве значения.[2]
импорт java.rmi.Naming;общественный учебный класс RmiClient { общественный статический пустота главный(Нить аргументы[]) бросает Исключение { RmiServerIntf сервер = (RmiServerIntf)Именование.искать("// localhost / RmiServer"); Система.из.println(сервер.getMessage()); }}
Перед запуском этого примера нам нужно создать «заглушку» для интерфейса, который мы использовали. Для этой задачи у нас есть компилятор RMI - rmic
- Примечание: мы делаем заглушку из файла '* .class' с реализацией удаленного интерфейса, а не из файла '* .java'.
rmic RmiServer
Обратите внимание, что начиная с версии 5.0 J2SE была добавлена поддержка динамически генерируемых файлов-заглушек, а rmic предоставляется только для обратной совместимости с более ранними средами выполнения,[3] или для программ, которые не предоставляют явный номер порта (или ноль) при экспорте удаленных объектов, что требуется для возможности создания заглушек, как описано в документации Javadoc для UnicastRemoteObject. См. Комментарий в конструкторе выше.
Рекомендации
- ^ Тейлор, Ян Дж (2005). От P2P к веб-службам и сетям: одноранговые узлы в мире клиент / сервер. Компьютерные коммуникации и сети. Лондон: Springer-Verlag. Дои:10.1007 / b138333. ISBN 1852338695. OCLC 827073874.[страница нужна]
- ^ Уилсон, М. Джефф (10 ноября 2000 г.). «Умейте с прокси и RMI». JavaWorld. Получено 2020-07-18.
- ^ «Примечания к выпуску Java RMI». Oracle. Получено 9 мая 2012.
внешняя ссылка
- "Главная страница удаленного вызова метода". Oracle Technology Network для разработчиков Java. Редвуд-Шорс, Калифорния, США: Корпорация Oracle. Получено 2014-07-14.
- Учебник Java RMI - хорошая отправная точка для изучения RMI. Также проверьте Hello World в RMI
- онлайн-обучение Java RMI - Очень хорошо для обучения JavaRMI и в качестве справки
- Страница RMI в документации JDK
java.rmi
(Справочник Sun по Java API для пакета RMI)- Энн Воллрат; Роджер Риггз; Джим Уолдо. «Распределенная объектная модель для системы Java» (PDF). Получено 2009-02-11. Цитировать журнал требует
| журнал =
(помощь) - Программирование WebLogic RMI - введение в RMI в Oracle Weblogic.
- Общий вызов удаленного метода