stringtranslate.com

Удаленный вызов метода Java

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

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

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

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

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

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

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

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

Джини версия

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


Пример

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

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

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

rmic RmiServer

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

Рекомендации

  1. ^ Тейлор, Ян Дж (2005). От P2P к веб-сервисам и сетям: одноранговые узлы в мире клиент/сервер . Компьютерные коммуникации и сети. Лондон: Springer-Verlag. дои : 10.1007/b138333. ISBN 1852338695. ОКЛК  827073874.[ нужна страница ]
  2. Уилсон, М. Джефф (10 ноября 2000 г.). «Будьте умны с прокси и RMI». JavaWorld . Проверено 18 июля 2020 г.
  3. ^ «Примечания к выпуску Java RMI» . Оракул . Проверено 9 мая 2012 г.

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