RMI с несколькими хостами - PullRequest
       4

RMI с несколькими хостами

3 голосов
/ 21 сентября 2011

Я работаю над программой, которая использует RMI для 2-х соединений, одно от клиента к серверу, и другое для связи между 2-мя виртуальными машинами на клиенте.

Кажется, реестр RMI должен работать на сервере (в противном случае я получаю java.rmi.AccessException: Registry.Registry.rebind disallowed; origin <client ip> is non-local host). Кроме того, клиент не может подключиться к серверу без предварительного вызова System.setProperty("java.rmi.server.hostname", <server ip>);.

Итак, я попытался создать реестр на сервере и на клиенте. Связь между одной виртуальной машиной на клиенте и другой осуществляется с использованием второго реестра, созданного на клиенте. Этот второй реестр создан без нареканий. Однако, поскольку я ранее установил свойство java.rmi.server.hostname, я получаю еще одно исключение: java.rmi.ConnectException: Connection refused to host: <server ip>.

У меня грязное решение на месте; вместо каждого Registry.rebind() для реестра клиентов я звоню

System.setProperty("java.rmi.server.hostname", "localhost");
Registry registry = LocateRegistry.
Remote stub = (Remote) UnicastRemoteObject.exportObject(remote, 0);
registry.rebind(name, stub);
System.setProperty("java.rmi.server.hostname", <server ip>);

Есть ли лучший способ справиться с этой проблемой? Можно ли создавать и использовать два реестра корректно, или клиент и сервер могут совместно использовать реестр?

1 Ответ

1 голос
/ 30 января 2013

Вам не нужно писать System.setProperty("java.rmi.server.hostname", <server ip>); на клиенте, потому что hostname определяет имя хоста приложения для локально связанных объектов реестра. Смотрите здесь: java.rmi Свойства

Вам даже не нужно запускать реестры на разных портах. Просто постарайтесь сделать это простым. Если что-то неясно, вы можете спросить снова.

...