Что такое rmi
Перейти к содержимому

Что такое rmi

Описание и пример 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 в другом приложении.

import java.io.Serializable; public class Card implements Serializable < private static final long serialVersionUID = 1L; private String name ; private String number; private double money ; public Card(String name, String number, double money) < super(); this.name = name; this.number = number; this.money = money; >@Override public boolean equals(Object card) < Card crd = (Card)card; return this.getNumber().equals(crd.getNumber()); >>
Листинг RMI сервиса, BillingService

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

import java.rmi.*; public interface BillingService extends Remote < // Регистрация новой карты public void addNewCard(Card card) throws RemoteException; // Добавление денежных средств на карту public void addMoney(Card card, double money) throws RemoteException; // Снятие денежных средств с карты public void subMoney(Card card, double money) throws RemoteException; // Получение баланса карты public double getCardBalance(Card card) throws RemoteException; >
Листинг 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 объект.

import java.util.List; import java.util.ArrayList; import java.rmi.RemoteException; import java.rmi.registry.Registry; import java.rmi.registry.LocateRegistry; import java.rmi.server.UnicastRemoteObject; import com.rmi.shared.BillingService; import com.rmi.shared.Card; public class BillingServiceImpl extends UnicastRemoteObject implements BillingService < private static final long serialVersionUID = 1L; private Listcards; // инициализация сервера public BillingServiceImpl() throws RemoteException < super(); cards = new ArrayList(); > @Override public void addNewCard(Card card) throws RemoteException < cards.add(card); System.out.println("register card : " + card.getNumber()); >@Override public void addMoney(Card card, double money) throws RemoteException < for (Card crd : cards) < if (crd.equals(card)) < crd.setMoney(crd.getMoney() + money); System.out.println("add money : " + "card " + card.getNumber() + ", summa = " + money); break; >> > @Override public void subMoney(Card card, double money) throws RemoteException < for (Card crd : cards) < if (crd.equals(card)) < crd.setMoney(crd.getMoney() - money); System.out.println("sub money : " + "card : " + card.getNumber() + ", summa = " + money); break; >> > @Override public double getCardBalance(Card card) throws RemoteException < double balance = 0; for (Card crd : cards) < if (crd.equals(card)) < balance = crd.getMoney(); System.out.println("balance : " + "card : " + card.getNumber() + ", summa = " + balance); break; >> return balance; > /** * Старт удаленного RMI объекта BillingService * @param args аргументы * @throws Exception */ public static void main (String[] args) throws Exception < String localhost = "127.0.0.1"; String RMI_HOSTNAME = "java.rmi.server.hostname"; try < System.setProperty(RMI_HOSTNAME, localhost); // Создание удаленного RMI объекта BillingService service = new BillingServiceImpl(); // Определение имени удаленного RMI объекта String serviceName = "BillingService"; System.out.println("Initializing " + serviceName); /* * Регистрация удаленного RMI объекта BillingService * в реестре rmiregistry */ Registry registry = LocateRegistry.createRegistry(1099); registry.rebind(serviceName, service); System.out.println("Start " + serviceName); >catch (RemoteException e) < System.err.println("RemoteException : "+e.getMessage()); System.exit(1); >catch (Exception e) < System.err.println("Exception : " + e.getMessage()); System.exit(2); >> >
Старт серверного приложения

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

set CLASSPATH=C:\rmi-server\bin java com.rmi.server.BillingServiceImpl PAUSE

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

C:\rmi-server>set CLASSPATH=C:\rmi-server\bin C:\rmi-server>java com.rmi.server.BillingServiceImpl Initializing BillingService Start BillingService

Сервер переходит в режим ожидания .

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

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

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

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

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

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

Все вызовы методов интерфейса BillingService обрамлены конструкцией try . catch с перехватыванием исключений типа RemoteException.

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

import java.net.MalformedURLException; import java.rmi.*; import com.rmi.shared.BillingService; import com.rmi.shared.Card; public class BillingClient < String localhost = "127.0.0.1"; String RMI_HOSTNAME = "java.rmi.server.hostname"; String SERVICE_PATH = "rmi://localhost/BillingService"; String[][] CARDS = , >; double[] MONEYS = ; public BillingClient() < try < System.setProperty(RMI_HOSTNAME, localhost); // URL удаленного объекта String objectName = SERVICE_PATH; BillingService bs; bs = (BillingService) Naming.lookup(objectName); System.out.println("\nRegister cards . "); registerCards(bs); System.out.println("Add moneys . "); addMoney(bs); System.out.println("Get balance . \n"); getBalance(bs); >catch (MalformedURLException e) < e.printStackTrace(); >catch (RemoteException e) < e.printStackTrace(); >catch (NotBoundException e) < System.err.println("NotBoundException : " + e.getMessage()); >> private Card createCard (final int idx) < return new Card(CARDS[idx][0], CARDS[idx][1], 0); >private void registerCards(BillingService bs) < for (int i = 0; i < CARDS.length; i++) < Card card = createCard (i); try < bs.addNewCard(card); >catch (RemoteException e) < System.err.println("RemoteException : " + e.getMessage()); >> > private void addMoney(BillingService bs) < for (int i = 0; i < CARDS.length; i++) < Card card = createCard (i); try < bs.addMoney(card, MONEYS[i]); >catch (RemoteException e) < System.err.println("RemoteException : " + e.getMessage()); >> > private void getBalance(BillingService bs) < for (int i = 0; i < CARDS.length; i++) < Card card = createCard (i); try < System.out.println("card : " + card.getNumber() + ", balance = " + bs.getCardBalance(card)); >catch (RemoteException e) < System.err.println("RemoteException : " + e.getMessage()); >> > public static void main(String[] args) < new BillingClient(); System.exit(0); >>
Сообщения клиентского приложения

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

C:\rmi-client>set CLASSPATH=C:\rmi-client\bin C:\rmi-client>java com.rmi.client.BillingClient Register cards . Add moneys . Get balance . card : 1213-456-7890, balance = 135790.0 card : 987-654-3210, balance = 24680.0
Сообщения серверного приложения

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

C:\rmi-server>set CLASSPATH=C:\rmi-server\bin C:\rmi-server>java com.rmi.server.BillingServiceImpl Initializing BillingService Start BillingService register card : 1213-456-7890 register card : 987-654-3210 add money : card 1213-456-7890, summa = 135790.0 add money : card 987-654-3210, summa = 24680.0 balance : card : 1213-456-7890, summa = 135790.0 balance : card : 987-654-3210, summa = 24680.0

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

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

Что такое rmi

Пожалуйста, оформите её согласно правилам оформления статей.

Описание работы

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

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

Типичная реализация модели Java-RMI, использующая объекты ‘заглушки'(stub) и ‘скелета'(skeleton).

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

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

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

  • идентификатор удаленного объекта;
  • описание вызываемого метода;
  • развернутые параметры.

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

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

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

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

int q=centralWarehouse.getQuantity(“SuperSucker 100 Vacuum Cleaner”); 

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

interface Warehouse  int getQuantity(String description) throws RemoteException; Product getProduct(Customer cust) throws RemoteException;> 

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

Warehouse centralWarehouse =; 

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

При передаче объекта другой программе (он может быть параметром либо возвращаемым значением удаленного метода) нужен файл класса, соответствующий этому объекту. Например, метод, который возвращает значение типа Product. При компиляции клиентской программы должен быть сгенерирован файл класса Product.class.

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

История создания

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

Стандарты

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

Пример

Класс RmiServer — отслеживает RMI запросы и реализует интерфейс, используемый клиентом для вызова удаленных методов.

import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; import java.rmi.server.UnicastRemoteObject; import java.rmi.registry.*; public class RmiServer extends UnicastRemoteObject implements RmiServerIntf  public static final String MESSAGE = "Hello world"; public RmiServer() throws RemoteException  > public String getMessage()  return MESSAGE; > public static void main(String args[])  System.out.println("RMI server started"); // Create and install a security manager if (System.getSecurityManager() == null)  System.setSecurityManager(new RMISecurityManager()); System.out.println("Security manager installed."); > else  System.out.println("Security manager already exists."); > try  //special exception handler for registry creation LocateRegistry.createRegistry(1099); System.out.println("java RMI registry created."); > catch (RemoteException e)  //do nothing, error means registry already exists System.out.println("java RMI registry already exists."); > try  //Instantiate RmiServer RmiServer obj = new RmiServer(); // Bind this object instance to the name "RmiServer" Naming.rebind("//localhost/RmiServer", obj); System.out.println("PeerServer bound in registry"); > catch (Exception e)  System.err.println("RMI server exception:" + e); e.printStackTrace(); > > > 

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

import java.rmi.Remote; import java.rmi.RemoteException; public interface RmiServerIntf extends Remote  public String getMessage() throws RemoteException; > 

RmiClient class— клиент, использующий заместителя(proxy) удаленного объекта размещенного на стороне сервера и вызывающий его методы для получения данных. Если объект сервера реализует интерфейс java.io.Serializable вместо java.rmi.Remote , то он будет сериализован и клиенту будет передано его значение значение. [1] .

import java.rmi.Naming; import java.rmi.RemoteException; import java.rmi.RMISecurityManager; public class RmiClient  // "obj" is the reference of the remote object RmiServerIntf obj = null; public String getMessage()  try  obj = (RmiServerIntf)Naming.lookup("//localhost/RmiServer"); return obj.getMessage(); > catch (Exception e)  System.err.println("RmiClient exception: " + e); e.printStackTrace(); return e.getMessage(); > > public static void main(String args[])  // Create and install a security manager if (System.getSecurityManager() == null)  System.setSecurityManager(new RMISecurityManager()); > RmiClient cli = new RmiClient(); System.out.println(cli.getMessage()); > > 

Перед запуском этого приложения, необходимо создать файл ‘Заглушки'(Stub) для используемого интерфейса. Для этого можно воспользоваться RMI компилятором — ‘rmic’

  • Внимание: заглушка создается из *.class файла содержащего реализацию удаленного интерфейса, а не из ‘*.java’ файла*
rmic RmiServer

Файл server.policy — необходим для предоставлению серверу права TCP/IP соединения к удаленному регистру и RMI серверу.

grant  permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve"; permission java.net.SocketPermission "127.0.0.1:*", "accept"; >; 

Файл server.policy используется с помощью аргумента ‘-D’ в Java RTE :

java.exe -Djava.security.policy=server.policy RmiServer

Файл client.policy —необходим для того, чтобы клиент смог присоединиться к серверу RMI по TCP/IP.

grant  permission java.net.SocketPermission "127.0.0.1:*", "connect,resolve"; >; 

Файл no.policy — рекомендуется использовать для клиента либо сервера при возникновения проблем с соединением.

grant  permission java.security.AllPermission; >; 

Java RMI

Java RMI (Remote Method Invocation) — это технология удаленного вызова методов в Java. Она позволяет Java-программам вызывать методы на объектах, которые находятся на удаленных компьютерах, как будто они находятся локально.

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

Ваш провайдер знает о вас больше, чем ваша девушка? Присоединяйтесь и узнайте, как это остановить!
25 апреля, 2023

Дата-центры в опасности: источники бесперебойного питания APC подвержены удалённым хакерским атакам

Полное отключение инфраструктуры и потеря важных данных — вот, к чему могут привести выявленные уязвимости.

RMI что это

vedro-compota's picture

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

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

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

  1. передать параметры метода на другой компьютер
  2. сообщить объекту о необходимости выполнения метода
  3. а затем получить обратно возвращаемое значение

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

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

  1. ‘заглушки'(stub)
  2. и ‘скелета'(skeleton).

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

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

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

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

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

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

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

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

  1. идентификатор удаленного объекта;
  2. описание вызываемого метода;
  3. развернутые параметры.

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

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

  1. свертывание параметров;
  2. поиск вызванного объекта;
  3. вызов заданного метода;
  4. извлечение и развертывание возвращаемого значения или исключения, сгенерированного данным методом;
  5. передача пакета, состоящего из развернутых возвращаемых данных, объекту-заглушке на клиентском компьютере. (возвращаем данные)

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

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

int q=centralWarehouse.getQuantity(“SuperSucker 100 Vacuum Cleaner”);

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

interface Warehouse

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

Warehouse centralWarehouse = …;

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

При передаче объекта другой программе (он может быть параметром либо возвращаемым значением удаленного метода) нужен файл класса, соответствующий этому объекту. Например, метод, который возвращает значение типа Product. При компиляции клиентской программы должен быть сгенерирован файл класса Product.class.

Key Words for FKN + antitotal forum (CS VSU):

  • неофициальный форум фкн
  • ФКН ВГУ Воронеж
  • программирование Воронеж
  • ВГУ информатика
  • ВГУ компьютерных наук
  • Log in to post comments
  • 9296 reads

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

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