Для создания такого приложения необходимо создать 4 файла:
* Создать удаленный публичный интерфейс (интерфейс, обеспечиваемый сервером), расширяющий интерфейс Remote и определяющий прототип метода, реализующего требуемые функции. Каждый метод удаленного интерфейса должен объявлять java.rmi.RemoteException в своем предложении throws вдобавок к любым исключениям, специфичным для приложения.
1) Файл AddServerIntf.java (определение интерфейса):
import java.rmi.*;
public interface AddServerIntf extends Remote
{ //расширяет интерфейс Remote, объявление абстрактного
//метода интерфейса. Здесь метод, принимающий два double-параметра,
//тело - в реализующем классе
double add (double d1, double d2) throws RemoteException;
//все удаленные методы могут выбрасывать исключение //RemoteException
}
* Второй программный модуль – серверный модуль реализующий задачу клиента. Данный класс расширяет(наследует) класс UnicastRemoteObject и реализует интерфейс AddServerIntf. (Все удаленные классы должны расширять класс UnicastRemoteObject).
Файл AddServerImpl.java:
import java.rmi.*;
import java.rmi.server.*;
public class AddServerImpl extends UnicastRemoteObject implements
// UnicastRemoteObject – поддерживаются однонаправленые //серверы
AddServerIntf
{ //расширение класса UnicastRemoteObject и
//реализация интерфейса AddServerIntf
public AddServerImpl() throws RemoteException{
//конструктор класса AddServerImpl()
//все удаленные методы могут выбрасывать исключение RemoteException
}
public double add(double d1, double d2) throws RemoteException
//реализация удаленного метода (метод сервера вычисляет сумму
//параметров
{return d1+d2;}
}
* Третий файл содержит консольную (main) программу сервера, которая должна обновить RMI-реестр на машине-сервере (при помощи метода rebind() класса Naming, пакета java.rmi.*. Он связывает имя сервера с объектной ссылкой
3). Файл AddServer.java:
import java.net.*;
import java.rmi.*;
public class AddServer
{
public static void main(String args[])
//консольная программа сервера
{
try {
AddServerImpl addServerImpl=new AddServerImpl();
//Создается объект класса AddServerImpl
Naming.rebind("AddServer", addServerImpl);
//задается имя сервера, которое связывается с объектной ссылкой
}
catch (Exception e)
{
System.out.println("Exception: "+e);
}}}
* Создается консольное приложение клиента, реализующее клиентскую часть распределенного приложения. Данное приложение реализовано так, что IP- адрес (1-й параметр или имя сервера) и аргументы, для инициализации входных параметров метода, выполняющегося на сервере (второй и третий параметр, задаваемый через пробел), передаются в командной строке.
4). Файл AddClient.java:
import java.rmi.*;
public class AddClient {
public static void main(String args[])
{
try
{String addServerURL ="rmi://" + args[0] + "/AddServer";
//формирование строки в синтаксисе формирования URL,
//в соответствии с протоколом rmi, т.е. IP-адрес сервера и строку //AddServer –имя сервера
AddServerIntf addServerIntf = (AddServerIntf)Naming.lookup(addServerURL);
// Метод Naming.lookup (addServerURL) принимает rmi URL,
//и возвращает ссылку на объект типа AddServerIntf,
// которому можно направлять удаленные вызовы
System.out.println("The firt 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(); //превращение строковой переменной вdouble
//формирование второго значения
System.out.println("The sum is: " + addServerIntf.add(d1,d2));
// удаленный вызов метода add, возвращающего сумму чисел
}
catch (Exception e)
{
System.out.println("Exceptio is: " + e );
}}}
Откомпилировать все 4 исходных кода компилятором javac.