понимание последовательности вызовов во время RMI - PullRequest
0 голосов
/ 20 декабря 2011

У меня много сомнений относительно последовательности вызовов во время Удаленный вызов метода . Ниже приведены 4 безошибочных кода, которые я прочитал, чтобы понять RMI.

1.) ИНТЕРФЕЙС

import java.rmi.*;

public interface AddServerIntf extends Remote {
    double add(double d1, double d2) throws RemoteException;
}

2.) РЕАЛИЗАЦИЯ

import java.rmi.*;
import java.rmi.server.*;

public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {
 public AddServerImpl() throws RemoteException {} // what is it meant for ?

 public double add(double d1 , double d2) throws RemoteException {
      return d1 + d2;
 }
} 

3.) Класс AddServer

import java.net.*;
import java.rmi.*;

  public class AddServer {
   public static void main(String args[]) {
    try {
        AddServerImpl addServerImpl = new AddServerImpl();
        Naming.rebind("AddServer",addServerImpl); // what does it do and how ?
     }  catch(Exception exc) {
        System.out.println("Exception : " + exc);
       }
   }
  }

4.) Класс AddClient

import java.rmi.*;

public class AddClient {
  public static void main(String args[]) {
    try {
      String addServerURL = "rmi://" + args[0] + "/AddServer";
      AddServerIntf addServerIntf = (AddServerIntf)Naming.lookup(addServerURL); // how does it look up and how does it return ?
      System.out.println("The first number is : " + args[1]);
      double d1 = Double.valueOf(args[1]).doubleValue();
      System.out.println("The second number is : " + args[2]);
      double d2 = Double.valueOf(args[2]).doubleValue();
      System.out.println("The sum is : " + addServerIntf.add(d1,d2)); // what does it mean to call the method of an interface ?

    } catch(Exception exc) {
        System.out.println(exc);
      }
  }
}

Файлы на сервере: AddServer.class, AddServerImpl.class, AddServerImpl_Stub.class, AddServerIntf.class

Файлы на клиентском компьютере: AddServerIntf.class, AddClient.class, AddServerImpl_Stub.class

После сохранения указанных файлов в соответствующих местах я запускаю rmiregistry на сервере, затем запускаю сервер с помощью java AddServer и затем запускаю клиент с помощью java 127.0.0.1 20 30

Как только клиент запускает, что делает оператор (AddServerIntf)Naming.lookup(addServerURL); в коде AddClient делать?

Какие процедуры выполняются, когда клиентская программа начинает выполняться? Как это вернуть сумму?

Что делает утверждение Naming.rebind("AddServer",addServerImpl); в классе AddServer?

Наконец, когда я звоню, чтобы получить сумму, используя addServerIntf.add(d1,d2), что это значит (вызывая метод интерфейса)? Почему я вызываю метод интерфейса? И что это делает?

Я не могу понять механизм RMI, кто кого называет и КАК?.

1 Ответ

0 голосов
/ 20 декабря 2011

RMI: Удаленный вызов метода .

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

В типичном RMI есть две части:

  1. Клиент: объект, который вызывает
  2. Сервер: объект, который принимает вызовы клиента.

Прежде чем ответить на ваши вопросы один за другим, вот как происходит типичное взаимодействие клиент-сервер (высокий уровень).

Сервер запускается

  • Зарегистрируйте объект Remote (AddServerImpl) в своем реестре.
  • Начинает зажигание в порт (стандарт 999).

Клиент вызывает удаленный метод

  • Клиент запрашивает серверный регистр для удаленного объекта ((AddServerIntf)Naming.lookup(addServerURL))
  • Сервер возвращает удаленную заглушку (которая реализует тот же интерфейс, что и удаленный объект)
  • Клиент вызывает метод на заглушке (addServerIntf.add(d1,d2)))
  • Заглушка сериализует ( преобразование в формат, который может быть передан по сети ) входы ((d1,d2)), передает их на разрыв в качестве запроса.
  • На стороне сервера ввод десериализован ( воссоздает java-объекты из данных, полученных по сети ), и сервер выполняет метод для реального объекта (AddServerImpl).
  • Выход метода (return d1 + d2) возвращается методом, сервер сериализует выходные данные и отправляет их как ответ вызывающему клиенту
  • Заглушка десериализует ответ, и у вас есть вывод!

Позвольте мне ответить на ваши вопросы

что означает утверждение (AddServerIntf)Naming.lookup(addServerURL); в коде AddClient do ?

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

Что означает утверждение Naming.rebind("AddServer",addServerImpl); делать в классе AddServer?

- чтобы убедиться, что сервер знает (добавлен в свой реестр), что существует объект с именем «AddServer», ТАК ЧТО всякий раз, когда возникает запрос на вызов метода этого объекта, он может быть обслужен.

когда я звоню, чтобы получить сумму, используя addServerIntf.add (d1, d2), что это значит (вызывая метод интерфейса)? Почему я вызываю метод интерфейса? И что это делает?

- Интерфейс - это Java-механизм для достижения абстракции . Теперь, когда вы вызываете интерфейс изнутри, вызывается метод объекта, реализующего тот же интерфейс (в данном случае удаленно, объекта на сервере). Чтобы ответить на вопрос «почему», абстракция помогает разделить использование и реализацию. Так что вызывающей стороне не нужно знать детали реализации (), и он должен беспокоиться только о входных и выходных параметрах.

Чтобы ответить на оставшийся вопрос

Какие процедуры выполняются, когда клиентская программа начинает выполняться? Как это вернуть сумму?

- С фоном, пожалуйста, обратитесь к этой ссылке . Это объяснило гораздо лучше, чем я мог :).

...