RMI: Удаленный вызов метода .
Обычно, когда мы говорим, что я вызываю метод, мы неявно предполагаем, что метод класса загружен в той же JVM, что и вызывающий класс. RMI позволяет вам делать то же самое, но вызывающий метод и вызываемый объект находятся в разных JVM (обычно на двух разных физических машинах).
В типичном RMI есть две части:
- Клиент: объект, который вызывает
- Сервер: объект, который принимает вызовы клиента.
Прежде чем ответить на ваши вопросы один за другим, вот как происходит типичное взаимодействие клиент-сервер (высокий уровень).
Сервер запускается
- Зарегистрируйте объект 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-механизм для достижения абстракции . Теперь, когда вы вызываете интерфейс изнутри, вызывается метод объекта, реализующего тот же интерфейс (в данном случае удаленно, объекта на сервере). Чтобы ответить на вопрос «почему», абстракция помогает разделить использование и реализацию. Так что вызывающей стороне не нужно знать детали реализации (), и он должен беспокоиться только о входных и выходных параметрах.
Чтобы ответить на оставшийся вопрос
Какие процедуры выполняются, когда клиентская программа начинает выполняться? Как это вернуть сумму?
- С фоном, пожалуйста, обратитесь к этой ссылке . Это объяснило гораздо лучше, чем я мог :).