Лекция по RMI
В данной лекции есть два примера по RMI: один для сервера, где объект помещается в реестр, и один для работы с этим объектом.
Код сервера
public static final String UNIC_BINDING_NAME = "server.reverse";
public static void main(String[] args) throws Exception
{
//создание объекта для удаленного доступа
final ReverseImpl service = new ReverseImpl();
//создание реестра расшареных объетов
final Registry registry = LocateRegistry.createRegistry(2099);
//создание "заглушки" – приемника удаленных вызовов
Remote stub = UnicastRemoteObject.exportObject(service, 0);
//регистрация "заглушки" в реесте
registry.bind(UNIC_BINDING_NAME, stub);
//усыпляем главный поток, иначе программа завершится
Thread.sleep(Integer.MAX_VALUE);
}
Код клиента
public static final String UNIC_BINDING_NAME = "server.reverse";
public static void main(String[] args) throws Exception
{
//создание реестра расшареных объетов
final Registry registry = LocateRegistry.createRegistry(2099);
//получаем объект (на самом деле это proxy-объект)
Reverse service = (Reverse) registry.lookup(UNIC_BINDING_NAME);
//Вызываем удаленный метод
String result = service.reverse("Home sweet home.");
}
Так вот, если со сервером все нормально, то с клиентом проблема. Он не будет работать. Я сейчас изучаю RMI, и пробовал сделать что-нибудь интересное с помощью RMI. В общем, ближе к делу: в клиенте нужно использовать getRegistry(2099) вместо createRegistry(2099).
Иначе будет вот примерно такая ошибка: Exception in thread "main" java.rmi.server.ExportException: Port already in use: 3333;
Ознакомившись немного с документацией по классу LocateRegistry все становится на свои места: метод createRegistry помещает на определенный порт Registry, а так же возвращает ссылку на помещенный на порт Registry, чтобы можно было забиндить туда наш прокси объект-заглушку, который бы обрабатывал запросы, если же там уже будет Registry, то бросает исключение, а getRegistry обращается к порту, и если там уже есть Registry - возвращает его, иначе бросает исключение.
Просьба исправить данный код, чтобы он был работоспособным.