Я работаю над программой, которая использует 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>);
Есть ли лучший способ справиться с этой проблемой? Можно ли создавать и использовать два реестра корректно, или клиент и сервер могут совместно использовать реестр?