Java RMI - превращение клиента в сервер - PullRequest
4 голосов
/ 26 января 2011

Если я хочу включить двустороннюю связь в моем приложении RMI (то есть разрешить серверу вызывать методы на клиенте, а клиенту вызывать методы на сервере), это самый простой способ сделатьа также клиент в удаленный класс?

Также, если я намереваюсь передать экземпляры моего клиента на сервер в качестве параметра метода, я прав, считая, что нет необходимости добавлять «класс клиента» вмагистр?

И последний вопрос, все ли мои классы должны быть скомпилированы в одном месте?IE я могу скомпилировать сервер и клиент на двух полностью независимых машинах и ожидать, что они будут правильно взаимодействовать?

* РЕДАКТИРОВАТЬ **

Еще один вопрос, мой вопрос ссылаетсяМой клиентский интерфейс (IClient): у него есть arraylist (поэтому у меня есть ArrayList<IClient>) для хранения новых экземпляров клиента, чтобы сервер мог отслеживать зарегистрированных клиентов.Когда я пытаюсь скомпилировать сервер на другом компьютере, он жалуется, что не может найти IClient - очевидно, поскольку IClient находится на клиентском компьютере.Как мне обойти это?

Ответы [ 3 ]

3 голосов
/ 26 января 2011

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

Вот два альтернативных решения, которые хорошо сработали для нас:

  • чтобы клиент вызывал сервер, а сервер блокировал вызов, пока данные не будут доступны клиенту. Это использует поток для каждого клиента (если вы не используете NIO), но легко реализуемо. Периодически возвращайте значение null, чтобы предотвратить закрытие длинного звонка от клиента брандмауэром (конечно, в зависимости от конфигурации брандмауэра)

  • если вы хотите, чтобы с хорошими java-интерфейсами можно было играть, рассмотрите Hessian , который очень легкий, работает поверх HTTP и не беспокоится о реестре RMI или подобных вещах

  • если вы намереваетесь открыть сторону сервера для других клиентов, Hessian по-прежнему является хорошим выбором, но если масштабирование является проблемой, изучите стиль RESTful architectur.

3 голосов
/ 26 января 2011

Вы правы во всех своих предположениях.

Вам не нужно добавлять удаленно вызываемые клиентские классы в реестр rmi, но вы все равно должны их экспортировать.

Единственное предостережение при компиляции заключается в том, что они должны выполняться с одной и той же версией Java с одинаковыми настройками компилятора (по крайней мере, те, которые влияют на генерацию заглушки RMI).

0 голосов
/ 27 января 2011

Ваш последний вопрос, классы удаленного интерфейса и все классы, от которых они зависят, и т. Д. Рекурсивно, пока замыкание не должно присутствовать на обоих хостах.

...