Инструменты пользователя

Инструменты сайта


java_rmi

Назад

RMI (Remote method Invocation) — механизм, который позволяет вызывать метод удалённого объекта. Согласно ему, все операции по подготовке и передаче данных инкапсулируются в вызываемом методе клиентского объекта-заглушки (stub). Сам же вызов метода ничем не отличается от вызова метода обычного локального объекта, за небольшим исключением:

  • Локальные объекты передаются по значению (копии)
  • При передаче удалённого (Remote) объекта, если он экспортирован, передаётся stub этого объекта
  • Передаваемые объекты должны быть Serializable
  • Кроме всех прочих исключительных ситуаций, при вызове удалённого метода может возбуждаться исключение RemoteException (ошибки маршализации/демаршализации, передачи данных и другие возможные ошибки протокола)

Задача RMI — организация клиент-серверного взаимодействия. Это значит, что вам не придётся беспокоится о передаче и предварительной обработке данных (протокол и т.д.). Но не во всех случаях. Если в вашей клиент-серверной среде подразумевается работа программ, написанных не только на java, от RMI толку мало (хотя при большом желании можно попытаться «выкрутиться» при помощи JNI).

HelloService
//Данный интерфейс должен быть реализован и у клиента и у сервера.
import java.rmi.*;
 
public interface HelloService extends Remote 
{
    Object sayHello(String name) throws RemoteException;
    Object sayWorld() throws RemoteException;
}
server
import java.rmi.*;
import java.rmi.registry.*;
import java.rmi.server.*;
 
public class Server implements HelloService
{
 
    public Object sayHello(String name)
    {
        String string = "Hello, " + name;
 
        try
        {
            System.out.println(name + " from " + UnicastRemoteObject.getClientHost());
        } catch (ServerNotActiveException e)
        {
            System.out.println(e.getMessage());
        }
        return string;
    }
 
    public Object sayWorld()
    {
        return "Hello World";
    }
 
    public static void main(String[] args) throws Exception
    {
        //Инициализируем порт соединения 
        System.out.print("Starting registry...");
        final Registry registry = LocateRegistry.createRegistry(2099);
        System.out.println(" OK");
 
 
        //Экспорт удаленного объекта, чтобы сделать его доступным для приема входящих вызовов
        final HelloService service = new Server();
        Remote stub = UnicastRemoteObject.exportObject(service, 0);
 
        //Регистрируем наш объект указываем имя для поиска
        System.out.print("Binding service...");
        registry.bind("HelloService", stub);
        System.out.println(" OK");
 
    }
}
client
import java.rmi.registry.*;
 
public class Client
{
    public static void main(String[] args) throws Exception
    {
        //подключаемся к серверу RMI ip+port
        Registry registry = LocateRegistry.getRegistry("localhost", 2099);
 
        //Указываем имя RMI для использования объекта.
        HelloService service = (HelloService) registry.lookup("HelloService");
 
        System.out.println(service.sayHello("Александр"));
        System.out.println(service.sayWorld());
    }
}