63315

Удаленный интерфейс. Remote Method Invocation

Лекция

Информатика, кибернетика и программирование

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

Русский

2014-06-19

66.5 KB

1 чел.

  1.  Remote Method Invocation    

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

Удаленный интерфейс

RMI большей частью использует интерфейсы. При создании своего удаленного объекта вы скрываете его низкоуровневую реализацию, передавая ссылку на его интерфейс. Таким образом, когда удаленный клиент получает ссылку на объект, на самом деле он получает ссылку на интерфейс, который по некоторой причине оказывается подсоединенным к локальному коду – “заглушке”, который и производит переговоры по сети. Но вы не заботитесь об этом, вы просто посылаете сообщения через ссылку на  интерфейс.    

Когда вы создаете удаленный  интерфейс, вы должны следовать следующей инструкции:

  1.  Удаленный  интерфейс должен быть открытым – public (он не должен иметь “доступ на уровне пакета”, так же он не может быть “дружественным”). В противном случае клиенты будут получать ошибку при попытке загрузки удаленного объекта, реализующего удаленный  интерфейс.
  2.  Удаленный  интерфейс должен расширять интерфейс, java.rmi.Remote.
  3.  Каждый метод удаленного интерфейса должен объявлять java.rmi.              RemoteException в своем предложении throws вдобавок к любым исключениям, специфичным для вашего приложения.
  4.  Удаленный объект, передаваемый как аргумент или возвращаемое значение (прямо или косвенно как объект – член локального объекта), должен быть объявлен как удаленный  интерфейс, а не как класс с реализацией.
Ниже приведен простой удаленный  интерфейс, представляющий сервис точного времени:
import java.rmi.* ;
interface PerfectTimeI extends Remote {
        long  getPerfectTime () throws RemoteException;
Он выглядит как любой другой интерфейс, за исключением того, что расширяет  другой интерфейс Remote и все его методы выбрасывают RemoteException. Помните, что интерфейс и все его методы автоматически становятся public.
 
Реализация удаленного  интерфейса
Сервер должен содержать класс, который расширяет UnicastRemoteObject и реализует удаленный  интерфейс. Этот класс также может иметь другие методы, но для клиента доступны только методы удаленного  интерфейса, так как клиент получает ссылку только на удаленный  интерфейс, а не на класс, который его реализует.
Вы должны явно определить конструктор для удаленного объекта, даже если вы определяете конструктор по умолчанию, который вызывает конструктор базового класса. Вы должны написать его, так как он должен выбрасывать RemoteException.
Ниже приведена реализация удаленного интерфейса PerfectTimeI:
import  java.rmi.* ;
import  java.rmi.server.* ;
import  java.rmi.registry.* ;
import  java.rmi.net.* ;
public class PerfectTime extends UnicastRemoteObject implements PerfectTimeI {
         // Реализация интерфейса:
        public long getPerfectTime () throws  RemoteException {
                 return System.currentTimeMillis ();
        }
        //  Должна быть реализация конструктора
        //  для выбрасывания RemoteException :
      public PerfectTime () throw RemoteException {
                // super (); // вызывается автоматически
      }
      //  Регистрация для обслуживания RMI. Выбрасывает 
      //  исключения на консоль.
      Public static void main (String [] args) throws  Exception {
               System.setSecurityManager (new RMISecurityManager ());
               PerfectTime pt = new PerfectTime ();
               Naming.bind (“//Ready to do time”);
      }
 }
В   этом примере main () обрабатывет все установки сервера. Когда вы обслуживаете RMI объект, в определенном месте вашей программы вы должны:
  1.  Создать и установить менеджер безопасности, поддерживающий сервисы RMI. Как часть Java пакета, для RMI поддерживается только RMISecurityManager.
  2.  Создать один или несколько экземпляров удаленного объекта. Здесь вы видите создание объекта PerfectTime.
  3.  Зарегистрировать не менее одного удаленного объекта в реестре удаленных объектов RMI, чтобы в последствии ими можно было пользоваться. Этот удаленный объект может иметь методы, которые производят ссылки на другие удаленные объекты. Их также можно зарегистрировать в реестре, чтобы клиенту не пришлось обращаться к нему много раз.
Установка реестра
В рассмотренном примере вызывался статический метод Naming.bind(). Однако для вызова этого метода требуется, чтобы реестр был запущен отдельным процессом на вашем компьютере. Имя сервера реестра – это rmiregistry, и для запуска под 32-битной Windows необходимо выполнить следующую команду:
start rmiregistry
              port 1099
для запуска его в качестве фонового процесса или  start rmiregistry 2005
Как и многие другие сетевые программы, сервер rmiregistry располагается по IP адресу машины, с которой его установили, но он также должен прослушивать порт под определенным порядковым номером. Если вы вызовите rmiregistry как показано выше, без аргументов, будет использован порт по умолчанию 1099. Если вы хотите использовать другой порт, вы добавляете аргумент в командную строку, указывающий порт. Следующий пример устанавливает порт 2005, поэтому rmiregistry под управлением 32-битной Windows должен запускаться так:
start rmiregistry 2005
Информацию о порте также необходимо передать в метод bind(), наряду с IP адресом машины, где располагается сервер реестра. Но при попытке использовать локальный IP-адрес, как это делается при тестировании сетевых программ, возникает досадная проблема. В JDK 1.1.1 существовала пара таких проблем:
  1.  Локальный IP-адрес localhost не работает с библиотекой RMI. Поэтому для экспериментов с RMI на одной машине вы должны использовать настоящее имя машины.
  2.  Библиотека RMI не станет функционировать, пока у вас не будет настоящего TCP/IP соединения, даже если все ваши компоненты просто общаются друг с другом на одной машине. Это значит, что вы должны соединиться с вашим Internet-провайдером до того, как попробуете запустить программу, иначе возникнут странные сообщения об ошибках.
Если учесть все это, команда bind () примет вид:
Naming.bind (“//peppy: 2005/PerfectTime”, pt);

Если вы используете порт по умолчанию 1099, вам не нужно указывать порт, так что вы можете просто сказать:

Naming.bind("//peppy/PerfectTime", pt);

Вы можете выполнить локальную проверку оставив в покое IP адрес, а использовать только идентификатор:

Naming.bind("PerfectTime", pt);

Имя сервиса здесь произвольно. В данном случае PerfectTime выбрано просто как имя класса, но вы можете назвать так, как захотите. Важно, чтобы это было уникальное имя регистрации, чтобы клиент знал имя, когда будет искать определенный удаленный объект. Если имя уже зарегистрировано, вы получите AlreadyBoundException. Чтобы предотвратить это, вы всегда можете использовать rebind () вместо bind (), так как rebind () либо добавляет новый элемент, либо заменяет уже существующий.

Даже после завершения работы main(), ваш объект остается существовать в реестре, ожидая, что придет клиент и выполнит запрос. Пока rmiregistry остается запущенным, и вы не вызовите Naming, unbind () на вашей машине, объект будет оставаться там. По этой причине, при отладке вашего кода необходимо выгружать rmiregistry и перезапускать его, когда скомпилируете новую версию вашего удаленного объекта.

Вам не обязательно запускать rmiregistry как внешний процесс. Если вы знаете, что только ваше приложение использует регистрацию, вы можете загрузить ее внутри вашей программы с помощью строки:

 LocateRegistry.createRegistry(2005);

Как и раньше, 2005 - это номер порта, который использовался в этом примере. Это эквивалентно запуску rmiregistry 2005 из командной строки, но часто этот способ является более удобным при разработке RMI-приложений, так как это снижает число необходимых действий при запуске и остановке реестра. После того, как вы выполните этот код, вы можете вызвать Naming. bind (), как и ранее.

Создание заглушек и каркасов

Если вы откомпилируете и запустили PerfectTime . Java, оно не будет работать, даже если вы правильно запустили rmiregistry. Это происходит потому, что основного каркаса библиотеки RMI еще не создано. Вы должны сначала создать заглушки и каркасы, которые обеспечат работу сетевого соединения и позволят вам делать вид, что удаленный объект - это просто локальный объект на вашей машине.

То, что происходит за сценой - очень сложно. Любой объект, который вы передаете или получаете из удаленного объекта, должен реализовывать(1тр!етеп1) Serializable (если вы хотите передавать удаленные ссылки вместо целых объектов, аргументы объектов могут реализовывать Remote), так что вы можете представить, как заглушки и каркасы автоматически выполняют сериализацию и десериализацию во время | «упаковки» параметров методов и возвращаемых результатов. К счастью, вам не нужно знать всего этого, но вы должны создавать заглушки и каркасы. Это простой процесс: вы вызываете инструмент rmic для вашего откомпилированного кода, а он создает необходимые файлы. Так что от вас требуется включить еще один шаг в процесс компиляции.

PerfectTime.java находится в пакете clS.rmi:

rmic c!5.rmi.PerfectTime

Вам не нужно быть в директории, содержащей PerfectTime. class, когда вы исполняете эту команду, но результат будет помещен в текущий директорий (из которого вы запустили команду).

Когда выполнение программы rmic завершится успешно, вы найдете два новых класса в директории:

PerfectTime_Stub.class

PerfectTime_Skel.class

соответствующих заглушке и каркасу. Теперь вы готовы запустить общение клиента с сервером.

Использование удаленных объектов

Главная цель RMI состоит в упрощении использования удаленных объектов. Вы должны сделать только самую важную вещь в вашей клиентской программе: это поиск и получение удаленного интерфейса с сервера. Во всем остальном - это обычное программирование на Java: посылка сообщений объекту. Ниже приведена программа, использующая PerfectTime:

import java.rmi.*;

import Java . rmi . registry .*;

public class DisplayPerfectTime {

           public static void main (String [] args) throws Exception {

           System.setSecurityManager (new RMISecurityManager ()) ;

             PerfectTimel t = (PerfectTimel ) Naming. lookup (

     "//peppy: 2005/PerfectTime") ;

for(int i = 0; i < 10; i++)

                  System. out . println ( "Perfect time = " +

                        t . getPerf ectTime (

                }

        } ;

Использованный идентификатор совпадает с тем, что использовался при регистрации объекта в реестре помощью Naming, а первая часть представляет URL и номер порта. Так как вы используете URL, вы можете также указать любую машину в Internet.

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

Вы можете видеть, что вызов удаленного метода

t.getPerfectTime ( )

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


 

А также другие работы, которые могут Вас заинтересовать

45373. Педагогическая деятельность и педагогические взгляды В.А.Сухомлинского 38.5 KB
  Нравственное воспитание 6. Воспитание потребностей культура желаний 7. Трудовое воспитание 8. Другие идеи воспитание без наказаний зубрежка основа на эмоциональночувственной сфере 3 составные части воспитательного процесса.
45374. Место и роль государства в политической системе общества 47.01 KB
  Такая ситуация не может не влиять на природу действующих законов и подза конных актов которые порой могут между собой находиться в противоречии. Отсюда систематизация это упорядочение нормативных актов приведение их в определённую систему. Выделяют такие виды систематизации как: 1 инкорпорация форма систематизации путём объединения нормативных актов без изменения их со держания в сборник где каждый из актов сохраняет своё самостоятельное юридическое значение. На неофициальные инкорпоративные материалы нельзя ссылаться в процессе...
45375. Правовое государство: понятие и признаки 50.64 KB
  Основоположник античной политической науки Аристотель обосновал идею господства права и правовой законности а также идею права как критерия справедливости. Появляется теория разделения властей прав человека первое представление о законности. принципы и юридические гарантии законности Для начала следует отметить что законность это политикоправовое явление которое характеризует процесс совершенствования государственноправовой формы организации общества путем строгого и неуклонного соблюдения и исполнения действующего...
45376. Соотношение гражданского общества и государства 54.37 KB
  соотношение гражданского общества и государства Гражданское общество и государство представляют собой понятия которые отражают различные стороны жизни общества и противостоят друг другу. Без зрелого гражданского общества невозможно создание правового демократического государства поскольку именно сознательные свободные граждане способны формировать наиболее рациональные формы человеческого общежития. Соотношение гражданского общества и государства характеризуется тем что их нельзя ни отождествлять ни противопоставлять друг другу тем более...
45377. Исторические предпосылки возникновения права 57.96 KB
  Есть лишь отношения объективно требующие или не требую щие правового опосредования. Лишь в отдельных случаях субъект может не знать что стал участником правового отношения например оказавшись наследником по закону после смерти родственника проживавшего в другом городе. Механизм правового регулирования: понятие структура стадии процесса Право как инструмент социального управления призвано упорядочивать общественные отношения обеспе чивая реализацию позитивных интересов субъектов. Каждый из этапов и юридических элементов правового...
45378. ПОНЯТИЕ, ПРИЗНАКИ И СУЩНОСТЬ ПРАВА 43.74 KB
  Ценность права выражается в том что оно прежде всего выступает средством: − регулирования общественных отношений придаёт действиям людей согласованность упорядоченность уверенность; − защиты существующего общественного строя устанавливает меры юридической ответственности за общественно опасные и вредные деяния; − обновления общества фактором его прогресса содействует развитию тех социальных связей в которых заинтересовано общество; − решения глобальных проблем современности оборонных экологических и т. Эффективность правового...
45379. Социальное регулирование. Понятие, функции и виды социальных норм 64.66 KB
  Место и роль права в системе социального регулирования. Отличие права от других нормативных систем. При обсуждении роли права в системе социального нормативного регулирования значение имеют нормы третьей и четвертой группы в литературе именно их принято квалифицировать как социальные нормы. Именно в этих процессах доминирующие в обществе идеи права и правовые представления переводятся в форму юридических правил норм общего действия.
45380. Соотношение права и морали 51.65 KB
  соотношение права и морали. Единство права и морали заключается в следующем: право и мораль являются универсальными регуляторами поведения людей имеют способность проникать в различные области общественной жизни; право и мораль являются многомерными образованиями имеющими сложную структуру которая состоит из одинаковых и взаимодействующих между собой элементов; право и мораль действуют в едином поле социальных отношений; право и мораль служат общей цели совершенствованию и упорядочению общественной жизни...
45381. Принципы права понятие и классификация 47.7 KB
  принципы права понятие и классификация Принципы права это основные исходные начала положения идеи выражающие сущность права как специфического социального регулятора. Они воплощают закономерности права его природу и социальное назначение представляют собой наиболее общие правила поведения которые либо прямо сформулированы в законе либо выводятся из его смысла.Представляется что принципы права должны отражать и выражать основные ценности на которые ориентируется право. Принципы выступают в качестве своеобразной несущей конструкции...