Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЭУМК_ИТИРОД(Часть 1).docx
Скачиваний:
34
Добавлен:
11.05.2015
Размер:
1.17 Mб
Скачать

12.1 Удаленный интерфейс

RMI делает тыжелым использование интерфейсов. Когда вы хотите создать удаленный объект, вы помечаете, что лежащую в основе раелизаци нужно передавать через интерфейс. Таким образом, когда клиент получает ссылку на удаленный объект, на самом деле он получаете ссылку на интерфейс, который выполняет соединение с определенным местом кода, общающимся по сети. Но вы не заботитесь об этом, вы просто посылаете сообщения через ссылку на интерфейс.

Когда вы создаете удаленный интерфейс, вы должны следовать следующей иснтрукции:

  1. Удаленный интерфейс должен быь публичным - public (он не может иметь “доступ на уровне пакета”, так же он не может быть “дружественным”). В противном случае клиенты будут получать ошибку при попытке загрузки объекта, реализующего удаленный интерфейс.

  2. Удаленный интерфейс должен расширять интерфейс java.rmi.Remote.

  3. Каждый метод удаленного интерфейса должен объявлять java.rmi.RemoteException в своем предложении throws в добавок к любым исключениям, специфичным для приложения.

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

Ниже приведен простой удаленный интерфейс, представляющий сервис точного времени:

Листинг 24. Удаленный интерфейс PerfectTime.

import java.rmi.*;

interface PerfectTimeI extends Remote {

long getPerfectTime() throws RemoteException;

}

Он выглядит как любой другой интерфейс, за исключением того, что расширяет Remote и все его методы выбрасывают RemoteException. Помните, что interface и все его методы автоматически становятся public.

Реализация удаленного интерфейса

Сервер должен содержать класс, который расширяет UnicastRemoteObject и реализует удаленный интерфейс. Этот класс также может иметь другие методы, но для клиента доступны только методы удаленного интерфейса, так как клиент получает тоько ссылку на интерфейс, а не на класс, который его реализует.

Вы должны явно определить конструктор для удаленого объекта, даже если вы определяете только конструктор по умолчанию, который вызывает конструктор базового класса. Вы должны написать его, так как он должен выбрасывать RemoteException.

Ниже приведена реализация удаленного интерфейса PerfectTimeI:

Листинг 25 Реализация удаленного объекта PerfectTime.

import java.rmi.*;

import java.rmi.server.*;

import java.rmi.registry.*;

import java.net.*;

public class PerfectTime

extends UnicastRemoteObject

implements PerfectTimeI {

// Реализация интерфейса:

public long getPerfectTime()

throws RemoteException {

return System.currentTimeMillis();

}

// Должна быть реализация конструктора

// для выбрасывания RemoteException:

public PerfectTime() throws RemoteException {

// super(); // Вызывается автоматически

}

// Регистрация для обслуживания RMI. Выбрасывает

// исключения на консоль.

public static void main(String[] args)

throws Exception {

System.setSecurityManager(

new RMISecurityManager());

PerfectTime pt = new PerfectTime();

Naming.bind(

"//peppy:2005/PerfectTime", pt);

System.out.println("Ready to do time");

}

В этом примере main( ) обрабатывает все детали установки сервера. Когда вы обслуживаете RMI объект, в определенном месте вашей программы вы должны:

  1. Создать и установит менеджер безопасности, поддерживающий RMI. Как часть Java пакета, для RMI поддерживается только RMISecurityManager.

  2. Создать один или несколько экземпляров удаленного объекта. Здесь вы видите создание объекта PerfectTime.

  3. Зарегистрировать не менее одного удаленного объекта с помощью RMI удаленной регистрации объекта с целью загрузки Один удаленный объект может иметь методы, которые производят ссылки на другой удаленный объект. Это позволяет вам настроить так, чтобы клиент проходил регистрацию только один раз, при получении первого удаленного объекта.