Jump to content

Удаленный вызов метода Java

Типичная модель реализации Java-RMI с использованием объектов -заглушек и скелетов . Java 2 SDK, Standard Edition, v1.2 устранил необходимость в скелете.

Удаленный вызов метода Java ( Java RMI ) — это Java API , который выполняет удаленный вызов метода , объектно-ориентированный эквивалент удаленных вызовов процедур (RPC), с поддержкой прямой передачи сериализованных классов Java и распределенной сборки мусора .

Исходная реализация зависит от механизмов представления классов виртуальной машины Java (JVM) и, таким образом, поддерживает только вызовы от одной JVM к другой. Протокол, лежащий в основе этой реализации только для Java, известен как протокол удаленного метода Java (JRMP). Для поддержки кода, работающего в контексте, отличном от JVM, программисты позже разработали версию CORBA .

Использование термина RMI может обозначать исключительно интерфейс программирования или может обозначать как API, так и JRMP, IIOP или другую реализацию, тогда как термин RMI-IIOP (читай: RMI поверх IIOP ) конкретно обозначает интерфейс RMI, делегирующий большую часть функций поддерживающая реализация CORBA .

Основная идея Java RMI, протокола распределенной сборки мусора (DGC) и большая часть архитектуры, лежащей в основе исходной реализации Sun, взяты из функции «сетевых объектов» Modula-3 .

Обобщенный код

[ редактировать ]

Программисты исходного API RMI несколько обобщили код для поддержки различных реализаций, таких как транспорт HTTP . Кроме того, в CORBA была добавлена ​​возможность передавать аргументы « по значению » для обеспечения совместимости с интерфейсом RMI. Тем не менее, реализации RMI-IIOP и JRMP не имеют полностью идентичных интерфейсов.

Функциональность RMI поставляется в комплекте java.rmi, хотя большая часть реализации Sun находится в sun.rmi упаковка. Обратите внимание, что в версиях Java, предшествующих Java 5.0, разработчикам приходилось компилировать заглушки RMI на отдельном этапе компиляции, используя rmic. Версия Java 5.0 и более поздние версии больше не требуют этого шага.

Кровавая версия

[ редактировать ]

Jini предлагает более продвинутую версию RMI на Java. Он функционирует аналогично, но обеспечивает более продвинутую безопасность, возможности обнаружения объектов и другие механизмы для приложений с распределенными объектами. [1]


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

RmiServerIntf интерфейс
определяет интерфейс, который используется клиентом и реализуется сервером.
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface RmiServerIntf extends Remote {
    String getMessage() throws RemoteException;
}
RmiServer сорт
слушает запросы RMI и реализует интерфейс, который используется клиентом для вызова удаленных методов.
import java.rmi.Naming;
import java.rmi.RemoteException;
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 {
        super(0); // required to avoid the 'rmic' step, see below
    }

    public String getMessage() {
        return MESSAGE;
    }

    public static void main(String args[]) throws Exception {
        System.out.println("RMI server started");

        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.");
        }
           
        //Instantiate RmiServer
        RmiServer server = new RmiServer();

        // Bind this object instance to the name "RmiServer"
        Naming.rebind("//localhost/RmiServer", server);
        System.out.println("PeerServer bound in registry");
    }
}
RmiClient сорт
это клиент, который получает ссылку (прокси) на удаленный объект, расположенный на сервере, и вызывает его метод для получения сообщения. Если бы объект сервера реализовал java.io.Serializable вместо java.rmi.Remote, он был бы сериализован и передан клиенту как значение. [2]
import java.rmi.Naming;

public class RmiClient {
    public static void main(String args[]) throws Exception {
        RmiServerIntf server = (RmiServerIntf)Naming.lookup("//localhost/RmiServer");
        System.out.println(server.getMessage());
    }
}

Прежде чем запустить этот пример, нам нужно создать файл-заглушку для используемого нами интерфейса. Для этой задачи у нас есть компилятор RMI — «rmic».

  • Примечание: файл-заглушку мы делаем из файла *.class с реализацией удаленного интерфейса, а не из файла *.java.
rmic RmiServer

Обратите внимание, что начиная с версии 5.0 J2SE была добавлена ​​поддержка динамически генерируемых файлов-заглушек, а rmic предоставляется только для обратной совместимости с более ранними средами выполнения. [3] или для программ, которые не предоставляют явный номер порта (или ноль) при экспорте удаленных объектов, что необходимо для возможности создания заглушек, как описано в Javadoc для UnicastRemoteObject. См. комментарий в конструкторе выше.

  1. ^ Тейлор, Ян Дж (2005). От P2P к веб-сервисам и сетям: одноранговые узлы в мире клиент/сервер . Компьютерные коммуникации и сети. Лондон: Springer-Verlag. дои : 10.1007/b138333 . ISBN  1852338695 . OCLC   827073874 . [ нужна страница ]
  2. ^ Уилсон, М. Джефф (10 ноября 2000 г.). «Будьте умны с прокси и RMI» . JavaWorld . Проверено 18 июля 2020 г.
  3. ^ «Примечания к выпуску Java RMI» . Оракул . Проверено 9 мая 2012 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 95218bce870e8c2c9524f0fbf0418cbe__1718036280
URL1:https://arc.ask3.ru/arc/aa/95/be/95218bce870e8c2c9524f0fbf0418cbe.html
Заголовок, (Title) документа по адресу, URL1:
Java remote method invocation - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)