Сервер через RMI без реестра
У меня есть сервисный объект, к которому можно подключиться через RMI. В настоящее время я делаю это:
сервер
Registry r = LocateRegistry.createRegistry(1234);
r.bind("server", UnicastRemoteObject.exportObject(remoteServer, 0));
клиент
RemoteServer s = LocateRegistry.getRegistry("example.com", 1234).lookup("server");
Реестр на сервере имеет только одно использование, чтобы связать объект с одним сервером. Я подумал, что с таким же успехом могу сделать это на сервере:
UnicastRemoteObject.exportObject(remoteServer, 1234);
Но тогда как мне подключиться к объекту сервера с клиента?
2 ответа
Реестр RMI существует для решения проблемы начальной загрузки RMI, которая заключается в том, что вы можете получить удаленную заглушку только через удаленный вызов метода, а для выполнения удаленного вызова метода вам нужна удаленная заглушка. Реестр предоставлен LocateRegistry.getRegistry()
решает эту проблему (и используется внутри Naming.lookup()
если вы используете этот API). [Обратите внимание, что эта заглушка не получается с помощью удаленного метода: она синтезируется локально, используя предоставленный вами порт host:. Если они не верны, вы не узнаете, пока не используете заглушку реестра.]
У вас есть несколько вариантов решения проблемы с загрузкой RMI:
Используйте Реестр RMI.
Используйте сервер LDAP через JNDI с провайдером LDAP.
использование
UnicastRemoteObject,
сериализовать заглушку, полученную при экспорте объекта, и использовать общий файл или сокет или sneakernet, чтобы сделать заглушку доступной для клиентов.Использовать активацию RMI; сериализовать заглушку, полученную при регистрации активируемого, и распространить среди всех клиентов в файле вместе с клиентским приложением. С точки зрения распространения заглушки это намного проще, чем (3), потому что заглушка остается постоянной в течение всего срока службы приложения, тогда как в (3) вы должны перераспределять заглушку при каждом экспорте.
Вы можете видеть, что Реестр, безусловно, самый простой вариант. Обратите внимание, что вам нужно использовать его только для решения проблемы начальной загрузки. Когда у вас есть заглушка, удаленные методы вашего собственного приложения могут возвращать другие объекты: вам не нужно больше одного удаленного объекта в реестре. Вы можете считать это фабрикой удаленных объектов.
Не невозможно, но не очень практично, потому что реестр передает клиенту объект-заглушку экспортируемого объекта (см. http://www.developer.com/print.php/3455311). Если у вас нет другого механизма для этого, вы застрянете. Использование реестра в распределенных системах имеет другие преимущества, поэтому я бы порекомендовал сохранить его по другим причинам (прозрачность расположения и т. Д.).
Клиент использует URL-адрес rmi, например rmi://localhost:2020/server
см. /questions/14465712/svyaz-mezhdu-dvumya-otdelnyimi-nastolnyimi-prilozheniyami-java/55405660#55405660