2011-12-20 3 views
0

У меня есть много сомнений относительно последовательности вызовов во время Удаленный вызов метода. Ниже приведены 4 ошибки, которые я прочитал, чтобы понять, что такое RMA. RMI.понимание последовательностей вызовов во время 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, который называет кого и как?

+0

@voterToClose Я спросил, как работает вышеуказанный код? каковы шаги, которые связаны с возвратом результата w.r.t к вышеуказанному коду? –

+0

Я обновил свой ответ на основе отзывов. – Santosh

+0

Пожалуйста, позвольте мне, если мой обновленный ответ ответит на ваши вопросы! – Santosh

ответ

-2

RMI: Вызов удаленного метода.

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

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

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

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

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

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

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

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

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

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

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

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

- Это значит, что сервер знает (добавляет в своем реестре), что есть объект с именем «AddServer» SO THAT, когда есть запрос на вызов метода этого объекта, его можно было бы обслуживать ,

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

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

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

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

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

+1

Не очень понятно и немного неточно. Скелеты RMI были устаревшими с 1998 года. Связывание делает доступным доступ к клиенту с помощью именованного поиска. Суффиксы удаленного интерфейса, поэтому вызов интерфейса означает вызов заглушки, а заглушка вызывает удаленный объект. «Почему» - это потому, что клиент не имеет удаленного объекта, потому что он удален: он имеет объект-заглушку, который вместо этого использует тот же самый удаленный интерфейс. У вашей ссылки есть свои проблемы, см. Переписку. – EJP

+1

Я тоже согласен. И я думаю, что скелеты устарели, так как jdk1.2 – saplingPro

+0

Спасибо. Я жил в старую эпоху. Это то, что мне нравится в этом сайте. – Santosh