Лабораторная работа: Удаленный вызов методом RMI

3. Заглушки и скелеты

Дальше вы используете компилятор RMI, rmic, для генерации файлов заглушки и скелета. Компилятор запускается с указанием файла класса, реализующего удаленную службу.

>rmicCalculatorImpl

Попробуйте выполнить это в вашем каталоге. После запуска rmic вы должны найти файл Calculator_Stub. class.

4. Хост-сервер

Удаленные службы RMI должны быть помещены в процесс сервера. Класс CalculatorServer является очень простым сервером, предоставляющим простые элементы для размещения.

import java.rmi. Naming;

public class CalculatorServer {

public CalculatorServer () {try {

Calculator c = new CalculatorImpl();

Naming.rebind (»

rmi://localhost:1099/

CalculatorService», c);} catch (Exception e) {

System.out.println («Trouble:» + e);

public static void main (String args[]) {new CalculatorServer();

В этом примере вы видите вызов статического метода Naming. re bind() . Однако этот вызов требует, чтобы регистрация была запущена отдельным процессом на вашем компьютере. Имя сервера регистрации – это rmiregistry , и под 32‑битной Windows вы пишете:

start rmiregistry

для запуска в фоновом режиме.

Как и многие другие сетевые программы, rmiregistry обращается по IP адресу машины, на которой она установлена, но она также слушает порт. Если вы вызовите rmiregistry как показано выше, без аргументов, будет использован порт по умолчанию 1099. Если вы хотите использовать другой порт, вы добавляете аргумент в командную строку, указывающий порт. Следующий пример устанавливает порт 2005, так что rmiregistry под управлением 32-битной Windows должна запускаться так:

startrmiregistry 2005

Информация о порте также должна передаваться в команде bind() , наряду с IP адресом машины, где располагается регистрация. Но это может выявить проблему, если вы хотите проверять RMI программы локально. В выпуске JDK 1.1.1, есть целая связка проблем:

1) localhost не работает с RMI. Поэтому для экспериментов с RMI на одной машине вы должны использовать имя машины. Чтобы найти имя вашей машины под управлением 32‑битной Windows, перейдите в панель управления и выберите «Network». Выберите закладку «Identification», и посмотрите имя вашего компьютера. Регистр в имени игнорируется. (Пример имени: «peppy»)

2) RMI не работает, пока ваш компьютер имеет активные TCP/IP соединения, даже если все ваши компоненты просто общаются друг с другом на локальной машине. Это значит, что вы должны соединятся с вашим провайдером Internet до того, как попробуете запустить программу или будете огорчены неким сообщением об ошибке.

Если учесть все это, команда bind() принимает вид:

Naming.bind (« //peppy:2005/CalculatorService», с);

Если вы используете порт по умолчанию 1099, вам не нужно указывать порт, так что вы можете просто сказать:

Naming.bind (« //peppy/CalculatorService», с);

Вы можете выполнить локальную проверку, оставив в покое IP адрес, а использовать только идентификатор:

Naming.bind («CalculatorService», с);

Имя сервиса здесь произвольно. В данном случае CalculatorService выбрано просто как имя класса, но вы можете назвать так, как захотите. Важно, чтобы это было уникальное имя регистрации, чтобы клиент знал, когда будет искать, что производит удаленные объекты. Если имя уже зарегистрировано, вы получите AlreadyBoundException . Чтобы предотвратить это, вы всегда можете использовать rebind() вместо bind() , так как rebind() либо добавляет новый элемент, либо заменяет уже существующий.

К-во Просмотров: 304
Бесплатно скачать Лабораторная работа: Удаленный вызов методом RMI