Сервер через 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:

  1. Используйте Реестр RMI.

  2. Используйте сервер LDAP через JNDI с провайдером LDAP.

  3. использование UnicastRemoteObject, сериализовать заглушку, полученную при экспорте объекта, и использовать общий файл или сокет или sneakernet, чтобы сделать заглушку доступной для клиентов.

  4. Использовать активацию 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

Другие вопросы по тегам