Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

RMI для нескольких сетевых интерфейсов

Anna | 5.06.2014 | нет комментариев

В ходе работы возникла задача сделать несколько RMI реестров, доступных через различные сетевые интерфейсы (локальная сеть и интернет). И к моему изумлению я ничего толком не обнаружил в сети по этому вопросу. Следственно разобравшись сам, решил поделиться решением с людьми.

Дано

Сервер с двумя сетевыми интерфейсами: локальный и внешний IP-адреса. Интерфейс, применяемый заказчиком и реализуемый сервером:

public interface Server extends Remote {
    public String getMessage() throws RemoteException;
}

 

Задача

Сделать два RMI реестра, всякий для своего сетевого интерфейса.

Решение

Сразу оговорюсь, что подразумевается, что читатель знаком с основами RMI (если нет, то дозволено почитатьтуттут и тут).При создании реестра, он регистрируется на адрес указанный в параметре java.rmi.server.hostname. Следственно мы будем устанавливать свое значение hostname перед созданием всякого реестра. Для доступа из интернета значимо помнить, RMI использует 2 порта: один для реестра, один для объекта. Т.е. нужно открыть доступ из интернета к двум портам. Если не указать порт при создании объекта, то он будет сделан на неизвестном порту, тот, что может быть не доступен из интернета. Выходит, действия следующие:

  1. Пишем реализацию интерфейса с указанием порта;
  2. Создаем реестр для локальной сети;
  3. Создаем объект и регистрируем его в реестр;
  4. Передаем в java.rmi.server.hostname значение внешнего IP-адреса;
  5. Создаем реестр для внешней сети на одном из открытых портов;
  6. Создаем объект для внешней сети на втором из открытых портов и регистрируем его в реестре;
  7. Profit.
Реализация интерфейса

Значимо, Дабы в реализации интерфейса, в конструкторе указывался порт.

public final class ServerImpl extends UnicastRemoteObject implements Server { 
    public ServerImpl(int port) throws RemoteException {
        super(port);
    }

    @Override
    public String getMessage() throws RemoteException {
        return "hello";
    }
}
Создаем реестры

 

Registry localRegistry = LocateRegistry.createRegistry(localPort); //создаем реестр для локальной сети
ServerImpl localEngine = new ServerImpl(0); //создаем объект для локальной сети
registry.rebind("rmi://localServer", localEngine);//регистрируем объект в реестре

System.setProperty("java.rmi.server.hostname", "внешний IP-адрес"); //Устанавливаем внешний IP-адрес в java.rmi.server.hostname

Registry registry = LocateRegistry.createRegistry(remotePort1);  //создаем реестр для внешней сети на одном из открытых портов
RMIHttpServer engine = new RMIHttpServerImpl(remotePort2); //создаем объект для внешней сети на втором открытом порту
registry.rebind("rmi://remoteServer", engine); //регистрируем объект в реестре

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

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB