Rmi что это такое

RMI (Remote Method Invocation)

Случилось так, что поставленная задача требовала применения удалённого вызова методов. Порывшись на Хабре, ничего не нашел по данному вопросу (хотелось что-нибудь почитать в качестве первого знакомства, перед чтением документации). Изучив спецификации на java.sun.com спешу поделиться с вами своей первой статьей. 🙂

«Что такое RMI?»

«Зачем это нужно?»

Задача RMI — организация клиент-серверного взаимодействия. Это значит, что вам не придётся беспокоится о передаче и предварительной обработке данных (протокол и т.д.). Удобно? Да. Но не во всех случаях. Если в вашей клиент-серверной среде подразумевается работа программ, написанных не только на java, от RMI толку мало (хотя при большом желании можно попытаться «выкрутиться» при помощи JNI).

«Давайте уже что-нибудь напишем!»

Давайте. Рассмотрим на примере распределённых вычислений. Задача у нас такая: мы будем искать простые числа самым простым способом, перебором. Распределённо же будем проверять числа подбором делителей от 2 до sqrt(n), где n — число, которое проверяем. («Распределённые вычисления» — громкое название для такого примера. Но ведь вычисляем? Да! Распределённо? Распределённо!)

Решать задачу будем так: есть сервер, который будет «скармливать» числа на проверку «зарегистрировавшимся» клиентам, посему взаимодействовать мы будем в обоих направлениях (клиент->сервер — регистрация, сервер->клиент — число на проверку), для этого опишем 2 интерфейса:

Интерфейс ClientRegister ипользуется клиентом для регистрации себя на сервере в роли PrimeChecker`a. Сервер использует PrimeChecker для передачи клиенту числа на проверку.

Как вы уже заметили, удалённый интерфейс должен расширять, прямо или косвенно, интерфейс Remote. Так же среди прочих исключений определим RemoteException (о нём мы говорили выше).

Приступим к реализации сервера (полный код):

Создаём регистратор и связываем наш stub с именем ClientRegister. Регистратор будет принимать соеденения на 12345 порту.

Находим удалённый регистратор и запрашиваем у него stub связанный с именем «ClientRegister». Первый параметр LocateRegistry.getRegistry(null, 12345) — хост (null — localhost), второй — порт.

Далее экспортируем клиентский удалённый объект и передадим серверу stub (уже клиентский) — зарегистрируемся. Сервер добавит клиента в очередь доступных checker’ов и начнёт передавать ему числа для проверки. После проверки, если она завершилась без ошибок, клиент снова попадает в очередь и т.д.

Источник

Описание и пример RMI технологии

Технология RMI (Java Remote Method Invocation) позволяет java-приложению, запущенному на одной виртуальной машине, вызвать методы объекта, работающего на другой виртуальной машине JVM (Java Virtual Machine).

RMI основана на более ранней технологии удаленного вызова процедур Remote Procedure Call (RPC), разработанной в 80-х годах и используемой для процедурного программирования. RPC позволяет процедуре одного приложения вызывать функцию на другом компьютере, как будто эта функция является частью программы. Таким образом, RPC выполняет всю работу по организации сетевых взаимодействий и маршалинга данных (пакетирования параметров функций и возврата значений для передачи их по сети). Но механизм RPC, поддерживающий ограниченный набор простых типов данных, не может использовать объекты Java при обмене информацией. Вторым важным недостатком RPC является необходимость использования специального языка определения интерфейса (IDL) для описания функций, допускающих удаленный вызов. С целью устранения этих недостатков и была разработана технология RMI.

RMI содержит набор объектов (классов) для организации удаленного взаимодействия java-приложений. RMI системы часто включают два отдельных приложения : сервер и клиент. Серверное приложение, как правило, создает удаленные объекты (remote objects), делает доступные ссылки на эти объекты и находится в ожидании вызова методов этих объектов. Клиентское приложение получает у сервера ссылку на удаленные объекты, после чего вызывает его методы. Технология RMI, обеспечивающая механизм взаимодействия клиента и сервера передачей между ними соответствующей информацией, реализована в виде java.rmi пакета, содержащего целый ряд вложенных подпакетов; один из наиболее важных подпакетов java.rmi.server реализует функции сервера RMI.

RMI обеспечивает маршалинг данных по сети и позволяет java приложениям передавать объекты с помощью механизма сериализации объектов. В состав J2SE включены инструментальные средства сетевых взаимодействий из определенных интерфейсов программы; это означает, что RMI не требует от программиста знания языка IDL. Кроме того, никакого нейтрального к языку IDL интерфейса не требуется, так как RMI поддерживает только Java; достаточно собственных интерфейсов Java.

Описание удаленного RMI объекта

Серверный RMI объект должен наследовать (extends) свойства класса java.rmi.server.UnicastRemoteObject, который представляет базовые функциональные возможности, необходимые удаленным объектам для обслуживания удаленных запросов. Конструкторы и методы класса UnicastRemoteObject возбуждают исключение RemoteException.

Конструктор класса UnicastRemoteObject обеспечивает экспорт объекта, чтобы он был доступным для приема удаленных вызовов. Экспорт позволяет удаленному RMI объекту ожидать соединений с клиентами для осуществления взаимодействия типа «точка-точка» с использованием стандартных соединений через сокеты. Предполагается, что клиенты RMI должны осуществлять соединение с использованием порта 1099 для поиска удаленного объекта в реестре RMI сервера. Перегруженный конструктор класса UnicastRemoteObject позволяет определить свой номер порта для экспорта удаленного объекта. Ссылка установления связи с удаленным RMI объектом обычно имеет следующий вид :

где
host представляет собой имя компьютера, в котором определен реестр сервера rmiregistry для удаленных объектов с зарегистрированным удаленным RMI объектом,
port представляет собой номер порта, на котором работает серверное приложение. По умолчанию для реестра RMI объектов используется порт 1099, который можно в этом случае в ссылке не указывать;
object – это имя удаленного RMI объекта, зарегистрированного в реестре сервера.

Для связывания удаленного RMI объекта с реестром сервера используется один из методов bind или rebind. Метод rebind регистрирует объект в реестре с предварительной проверкой; если объект был ранее зарегистрирован под этим именем, то метод заменит его новым объектом. Это может потребоваться при регистриции новой версии существующего удаленного объекта.

Пример использования RMI

Рассмотрим использование механизма вызова методов удаленного объекта RMI на примере работы с электронной картой. Пример включает два приложения : серверное и клиентское. Серверное приложение ведет учет электронных карт и остатка средств на карте; деньги можно на карту положить и снять. Клиентское приложение регистрирует на сервере карты, добавляет и снимает денежные средства.

Серверное приложение включает три модуля :

• Card– электронная карта;
• BillingService– интерфейс сервиса объекта RMI;
• BillingServiceImpl– объект RMI.

Клиентское приложение также включает три модуля. Пересылаемый по сети объект Card и интерфейс описания RMI объекта BillingService в клиентском приложении должны совпадать с серверными. Третий модуль BillingClient использует интерфейс описания RMI объекта и Card для взаимодействия с объектом RMI, стартованном на сервере.

Листинг карточки, Card

В представленном ниже листинге класса Card.java не отображены методы get/set. Класс Card реализует интерфейс Serializable, который обеспечивает упаковку объекта в байт-коды в одном приложении и преобразования байт-кодов в объект Card в другом приложении.

Листинг RMI сервиса, BillingService

Интерфейс сервиса BillingService наследует свойства java.rmi.Remote и включает методы работы с картой Card. Во всех методах присутствует объект Card, передаваемый по сети между двумя java-приложениями.

Листинг RMI объекта, BillingServiceImpl

Класс BillingServiceImpl представляет собой удаленный объект, реализующий интерфейс BillingService. Чтобы сервер воспринимал его как RMI объект он наследует свойства класса UnicastRemoteObject. Приложение клиента взаимодействует с RMI-объектом типа BillingServiceImpl, вызывая методы addNewCard, addMoney, subMoney, getCardBalance, определенные в интерфейсе BillingService. Объект BillingServiceImpl хранит сведения о картах в коллекции cards.

При старте объекта в методе main определяется системное свойство ‘java.rmi.server.hostname’ как IP адрес локального компьютера (127.0.0.1), формируется и регистрируется в реестре RMI объект.

Старт серверного приложения

Для старта сервера используем командный файл (Window) run.rmi-server.bat со следующим кодом :

После старта серверного приложения в консоль выводится следующая информация :

Описание клиентского приложения

Как было отмечено выше, клиентское приложение включает 3 файла, два из которых, Card и BillingService, полностью совпадают с серверными. Третий модуль BillingClient для взаимодействия с объектом RMI использует интерфейс BillingService и электронную карту Card.

Разумнее было бы построить проекты таким образом, чтобы общие java-модули (Card и BillingService) были описаны только один раз в одном из приложений. Это можно было бы сделать, например, с использованием maven. Но в этом случае усложниться процесс описания проектов и, к тому же, (кто знает) будет ли у Вас в будущем при разработке собственного проекта доступ к исходным кодам серверного приложения? Возможно, что в Вашем распоряжении будут только интерфейсы взаимодействия и структуры объектов.

Листинг клиентского класса BillingClient

Класс BillingClient включает методы :

• createCard– создание объекта электронной карты;
• registerCards– регистрации карт;
• addMoney– добавления денежных средств на карты;
• getBalance– чтение остатков средств на картах.

В конструкторе класса сначала устанавливается соединение с RMI объектом, после чего последовательно вызываются методы регистрации карт, добавления денежных средств на карты и получения остатков средств на картах. Чтобы найти серверный RMI объект на локальном сервере, устанавливается системное свойство RMI_HOSTNAME (127.0.0.1) и определяется ссылка на объект (SERVICE_PATH) с использованием службы имен и каталогов JNDI (Java Naming and Directory Interface). Поскольку сервер при регистрации RMI объекта использовал порт 1099, то в ссылке порт не указывается.

Сообщения клиентского приложения

При старте клиентского приложения в консоль выводятся сообщения о выполнении определенных действий соответствующими методами. В заключении приводятся остатки денежных средств на картах.

Сообщения серверного приложения

Серверное приложение выводит в консоль сообщения при вызове методов :

Скачать пример

Исходный коды рассмотренного примера в виде двух проектов Eclipse можно скачать здесь (15.7 Kб). Проекты включают командные bat-файлы для проверки функционирования примера. Для этого достаточно только разместить проекты не диске C:\ (Windows) и стартовать командный файл сначала сервера, потом клиента.

Источник

Rmi что это такое

Rmi что это такое. original. Rmi что это такое фото. Rmi что это такое-original. картинка Rmi что это такое. картинка original

— Ничего себе! Звучит очень круто.

— Ага. Но я постараюсь дать только обзорную лекцию. Тут, если глубоко копать, можно запутаться в нюансах работы.

Но если не ударяться в крайности, то RMI не только очень прост, но и значительно упрощает жизнь программиста. За что ему глубокий респект.

Итак, мы хотим, чтобы один объект, находящийся в одной Java-программе, смог вызвать метод у объекта, находящегося в другой Java-программе. Где бы эти программы запущены ни были.

Мы рассмотрим самый простой пример, когда обе программы запущены на одном компьютере. Чтобы программы могли взаимодействовать через интернет, необходимы настройки в правах Java-машины, но сегодня мы это рассматривать не будем.

В Java удаленно можно вызывать только методы интерфейсов, но не классов.

Итак, у нас есть две программы, как же им вызывать методы друг друга?

Давай рассмотрим ситуацию, когда одна программа содержит в себе некоторый объект, а вторая хочет вызвать его методы. Назовем первую программу – сервером, а вторую – клиентом.

Я сначала дам пример кода, а потом мы его разберем.

— А что будет делать наша программа?

— Гм. Ну, давай для простоты, у программы будет один метод, который разворачивает переданную ему строку задом наперед.

Сначала нам понадобится интерфейс, который будет удовлетворять нашим требованиями:

Я создал интерфейс Reverse и добавил ему интерфейс-маркер Remote, а также исключение RemoteException. В процессе вызова метода могут происходить незапланированные сбои – тогда будет кидаться это исключение.

Затем нам нужно написать серверный класс, который бы реализовывал этот интерфейс:

— Вижу. В этом методе, мы разворачиваем строку задом наперед.

А теперь надо сделать этот объект доступным для вызова с другой программы. Вот как это делается:

Рассказываю по строкам.

Строка 1 – в переменной UNIC_BINDING_NAME храним придуманное нами уникальное имя нашего удаленного объекта (объекта, который доступен удаленно). Если программа шарит несколько объектов, у каждого должно быть свое уникальное имя. Уникальное имя нашего объекта — «server.reverse».

Строка 9 — создаем специальный объект – реестр. В нем надо регистрировать объекты, которые мы шарим. Дальше ими занимается Java-машина. 2099 – это порт (уникальный номер, по которому другая программа может обратиться к нашему реестру объектов).

Т.е. чтобы обратиться к объекту, надо знать уникальный номер реестра объектов (порт), знать уникальное имя объекта и иметь такой же интерфейс, как и тот, который реализовывает удаленный объект.

— Ясно. Что-то вроде – позвонить по телефону (нужен номер) и попросить Соню (имя объекта)?

Строка 11 – создание « заглушки ». Заглушка – это специальный объект, который принимает информацию об удаленном вызове, распаковывает ее, десериализует переданные параметры методов и вызывает нужный метод. Затем сериализует результат или исключение, если оно было, и отсылает все это назад вызывающему.

— Ясно. Почти. Ты сказал, что «десериализует параметры метода». Значит, типами аргументов удаленного метода могут быть только сериализуемые?

— Ага. А как же иначе ты будешь пересылать их по сети? Есть, правда, и исключения – так называемые объекты, которые передаются по ссылке, но сегодня мы о них говорить не будем.

Скажем так, пересылать несериализуемые объекты нельзя, но если очень хочется, то можно. Но это хлопотное дело, знаешь ли.

Строка 13 – регистрируем в реестре заглушку нашего объекта под уникальным именем.

Строка 16 – усыпляем главный поток. Все удалённые вызовы обрабатываются в отдельных нитях. Главное, чтобы программа в это время работала. Так что тут просто отправляем главную нить спать, и всё.

— Отлично, тогда пример клиента:

Объясняю код по строкам:

Строка 1 – уникальное имя удаленного объекта. Должно быть одинаковым на клиенте и сервере.

Строка 6 – получение ссылки на « Реестр удаленных объектов » по порту 2099, т.е. такому же, как и у реестра у серверного приложения.

Строка 9 – получаем объект у реестра. Полученный объект является proxy-объектом и приводится к типу интерфейса. Интерфейс должен быть унаследован от интерфейса-маркера Remote.

Строка 12 – вызываем методы интерфейса так, как будто объект был создан в этой же программе. Никакой разницы.

— Круто! Это ж теперь можно писать распределенные приложения. Или игры типа морского боя для Android.

— Побойся бога, Амиго, операционная система Android была запрещена в 27 веке после третьей попытки захватить мир. У роботов к ней вообще доступа нет. Вас же потом от нее не оттянешь. Будете бегать и кричать «Убить всех человеков!».

— Гм. Ладно. Хотя надо будет у Диего еще спросить. Мало ли, может он что-нибудь интересное про нее расскажет.

— Вот и спроси. Ладно, давай до завтра.

— Пока, Риша, спасибо за интересную лекцию.

Источник

RMI что это

Primary tabs

Rmi что это такое. picture 19 1455465074. Rmi что это такое фото. Rmi что это такое-picture 19 1455465074. картинка Rmi что это такое. картинка picture 19 1455465074

Forums:

RMI (англ. Remote Method Invocation) — программный интерфейс вызова удаленных (находящихся на других машинах) методов в языке Java.

Распределенная объектная модель, специфицирующая, каким образом производится вызов удаленных методов, работающих на другой виртуальной машине Java.

При доступе к объектам на другом компьютере возможно вызывать методы этого объекта.
Необходимо только =

Механизм RMI дает возможность организовать выполнение всех этих операций.

Типичная реализация модели Java-RMI, использующая объекты=

В терминах RMI объект, который вызывает удаленный метод, называется клиентским объектом, а удаленный объект — серверным объектом.

Компьютеры выступают в роли клиента и сервера только для конкретного вызова. Вполне возможно, что при выполнении следующей операции эти компьютеры поменяются ролями, то есть сервер предыдущего вызова может сам стать клиентом при обращении к объекту на другом компьютере.

При вызове метода удаленного объекта на самом деле вызывается обычный метод языка Java, инкапсулированный в специальном объекте-заглушке (stub), который является представителем серверного объекта.
Заглушка находится на клиентском компьютере, а не на сервере. Она упаковывает параметры удаленного метода в блок байтов. Каждый параметр кодируется с помощью алгоритма, обеспечивающего независимость от аппаратуры.

Например, числа всегда передаются в порядке, при котором сначала передается старший байт (big-endian). При этом объекты подвергаются сериализации.

Процесс кодирования параметров называется развертыванием параметров (parameter marshaling).

Основная цель развертывания параметров — преобразование их в формат, пригодный для передачи параметров от одной виртуальной машины к другой.

Передача данных удалённому объекту

Метод, принадлежащий заглушке, создает блок, в который входят следующие элементы:

Получение результатов работы удалённого объекта

Затем метод заглушки посылает эту информацию серверу. Далее объект-получатель выполняет для каждого вызова удаленного метода следующие действия:

Клиентский объект-заглушка свертывает возвращаемое значение или исключение, полученное с сервера. Результат свертывания становится возвращаемым значением метода заглушки.
Если удаленный метод возвращает исключение, то объект-заглушка повторит его в среде объекта-клиента.

Для вызова удаленного метода используется тот же синтаксис, что и для обращения к локальному методу.
Например, чтобы вызвать метод getQuantity() объекта-заглушки centralWarehouse центрального хранилища данных на удаленном компьютере, потребуется использовать приведенный ниже код.

Для доступа к удаленным методам клиентский код всегда использует объектные переменные типы interface. Например, с приведенным выше методом может быть связан следующий интерфейс:

Объявление переменной для объекта, который реализует этот интерфейс, будет выглядеть так:

Интерфейсы представляют собой абстракции и содержат только перечень методов.
Переменные типа interface всегда должны быть связаны с фактическим объектом. При вызове удаленных объектов переменная ссылается на объект-заглушку. При этом клиентская программа ничего не знает о типе заглушки, а сами заглушки и связанные с ними объекты создаются автоматически.

Источник

Подробно про RMI в Java

Удаленный вызов метода – это способ, которым программист использует язык программирования Java и его среду разработки удаленно.

Что такое RMI в Java?

RMI (Remote Method Invocation) – это API, который предоставляет механизм для создания распределенного приложения на Java. RMI позволяет объекту вызывать методы объекта, запущенного в другой JVM. Удаленный вызов метода обеспечивает удаленную связь между приложениями с использованием двух объектов.

Объект-заглушка на клиентском компьютере создает информационный блок и отправляет эту информацию на сервер. Блок состоит из:

Rmi что это такое. rmi. Rmi что это такое фото. Rmi что это такое-rmi. картинка Rmi что это такое. картинка rmi

Скелетный объект передает запрос от объекта-заглушки к удаленному объекту. Он выполняет следующие задачи:

Теперь рассмотрим шаги для создания приложения RMI.

Шаг 1: Определение удаленного интерфейса

Первое, что нам нужно сделать, это создать интерфейс. Это предоставит описание методов, которые могут быть вызваны удаленными клиентами. Этот интерфейс должен расширять интерфейс Remote, а прототип метода в интерфейсе должен выдавать исключение RemoteException.

Шаг 2: Реализация удаленного интерфейса

Следующим шагом является реализация удаленного интерфейса. Для реализации удаленного интерфейса класс должен быть расширен до класса UnicastRemoteObject пакета java.rmi. Кроме того, конструктор по умолчанию должен быть создан для выброса java.rmi.RemoteException от его родительского конструктора.

Шаг 3: Создание объектов Stub и Skeleton из класса реализации с использованием rmic

Инструмент RMIC используется для вызова компилятора RMI, который создает объекты Stub и Skeleton. Его прототип – имя класса RMIC.

ШАГ 4: Запустите RMIregistry

Чтобы запустить службу реестра, введите в командной строке команду запуска RMIregistry.

ШАГ 5. Создание и выполнение прикладной программы сервера

Следующим шагом является создание прикладной программы сервера и ее выполнение в отдельной командной строке.

Шаг 6. Создание и выполнение программы клиентского приложения

Последний шаг – создание программы клиентского приложения и ее выполнение в отдельной командной строке. Метод lookup класса Naming используется для получения ссылки на объект Stub

Вышеуказанная клиентская и серверная программа выполняется на одной машине, поэтому используется localhost. Чтобы получить доступ к удаленному объекту с другого компьютера, локальный хост должен быть заменен IP-адресом, на котором находится удаленный объект.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *