Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно организовать проект с RMI 
V
    Опции темы
StormDK
Дата 5.4.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Что такое RMI и как оно работает я представляю, но опыта разработок нет, поэтому вопрос:

- локальная сеть
- на некоторых любых машинах ( например А, Б, С, Д) стоит удалённый серверный объект (на всех машынах один и тот же) - методы этого объекта и будем вызывать удалённо.
- на некоторой любой машине стоит клиентское приложение
- для начала клиентское приложение должно показать, что на машинах А, Б, С, Д нашей сети установлен наш удаленный объект и мы можем его пользовать с той машины, с которой нам нужно.

================================================
Как клиентское приложение узнает о всех удалённых объектах?
================================================

Как я понимаю, все эти удалённые объекты должны зарегестрироваться на определённой машине SpecMashina:

Код

Naming.rebind("rmi://SpecMashina/MainService", obj); 


а клиент будет делать что-то типо

Код

// Список всех зарегестрированных удалённых объектов
NamingEnumeration<NameClassPair>  e = namingContext.list("rmi://SpecMashina");

while (e.hasMore())
{
    String str = e.next().getName();
    Calculator c = (Calculator) Naming.lookup( "rmi://SpecMashina/str"); 
    c.method();  // Последовательный вызов метода у всех удалённых объектов
}


Возможно написал всё неправильно или не точно, но суть понятна.
( Тут  ещё вопрос, как добиться уникальности имени обекта при регестрации)

А можно как-нибудь развернуть это без SpecMashina - заранее обговоренного узла?

Например: пройтись по всем IP адресам сети и попытаться получить ссылку на наш объек. При этом на каждой машине регистрация объекта будет происходить в свой локальный реестр.



Это сообщение отредактировал(а) StormDK - 5.4.2007, 17:04
PM MAIL   Вверх
LSD
Дата 5.4.2007, 17:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(StormDK @  5.4.2007,  16:21 Найти цитируемый пост)
А можно как-нибудь развернуть это без SpecMashina - заранее обговоренного узла?

Никак, и клиент, и сервер, должны знать где находится RMI-registry.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
AntonSaburov
Дата 5.4.2007, 17:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

Репутация: 2
Всего: 118



Теоретически можно сделать некий сервис (пусть даже в виде конфиг-файла где-то в инете или на файл-сервере), который будет давать клиентам хост - но вообщем-то это масло масленное.
Но LSD прав - указывать все равно надо. Разве что попробовать "пинговать" сервер - например договориться по поводу порта и гонять некий "пинг" по всем машинам.
Но IMHO - не нудо этого - раз уж клиента установили - имя машины уж как-нибудь можно сделать.

PM MAIL WWW ICQ   Вверх
StormDK
Дата 5.4.2007, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Цитата(LSD @ 5.4.2007,  17:17)
Цитата(StormDK @  5.4.2007,  16:21 Найти цитируемый пост)
А можно как-нибудь развернуть это без SpecMashina - заранее обговоренного узла?

Никак, и клиент, и сервер, должны знать где находится RMI-registry.

Ну а всё, что я понаписал-то выше - правильно?

PS Ну а если каждая машина в своём локальном реестре зарегестрирует объект? А клиент будет стучать в rmi реестр каждой машины и пытаться получить ссылку на объект. Просто сеть-то локальная, компьютеров, впринципе, не много, можно просто все машины перебрать и постучаться в их локальный реестр - если ответили - вот и нашли наш объект. (Но конечно это как-то не эстетично). 

Т.е. Вы говорите, что все серверы должны делать так:
Код

Naming.rebind("rmi://SpecMashina/MainService", obj); 

?
А уникальность имён MainService я должен сам обрабатывать? Т.е. при каждой регестрации нового объекта нужно запросить полный список зарегестрированных объектов чтоб не повториться?


Это сообщение отредактировал(а) StormDK - 5.4.2007, 17:38
PM MAIL   Вверх
LSD
Дата 5.4.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(StormDK @  5.4.2007,  17:24 Найти цитируемый пост)
Ну а всё, что я понаписал-то выше - правильно?

Вообщем, да.

По поводу поиска RMI-registry - можно послать широковещательный UDP пакет, на заранее оговоренный порт, а сервер должен будет ответить на него. Но это прокатит только в локалке.

Цитата(StormDK @  5.4.2007,  17:24 Найти цитируемый пост)
А уникальность имён MainService я должен сам обрабатывать? Т.е. при каждой регестрации нового объекта нужно запросить полный список зарегестрированных объектов чтоб не повторится?

Для уникальности можно использовать java.util.UUID.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
StormDK
Дата 5.4.2007, 17:56 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



Цитата(LSD @ 5.4.2007,  17:42)
Цитата(StormDK @  5.4.2007,  17:24 Найти цитируемый пост)
Ну а всё, что я понаписал-то выше - правильно?

Вообщем, да.

По поводу поиска RMI-registry - можно послать широковещательный UDP пакет, на заранее оговоренный порт, а сервер должен будет ответить на него. Но это прокатит только в локалке.

Цитата(StormDK @  5.4.2007,  17:24 Найти цитируемый пост)
А уникальность имён MainService я должен сам обрабатывать? Т.е. при каждой регестрации нового объекта нужно запросить полный список зарегестрированных объектов чтоб не повторится?

Для уникальности можно использовать java.util.UUID.

Ну, вообщем, я всё понял. Спасибо.

Про широковещательную рассылку я уже думал ... По-мойму красивая идея )) Просто таким образом можно избавиться от единого центра (центрального RMI реестра) и тогда система получиться 100% свободной - куда хочу, туда и ставлю удалённый объект  и клиент с любой машины сможет их все найти!

Только:
1. Мы таким образом что-то типо смешаем разные уровни модели OSI в одном проекте -  широковещательная рассылка - 2-й уровень  - для получения ссылки на удалённый объект- это выше ))) - как-то не по академически )))
2. это конечно зависит от задачи... но с общим реестром всё-таки проще реализовать это.

Это сообщение отредактировал(а) StormDK - 5.4.2007, 17:58
PM MAIL   Вверх
COVD
Дата 5.4.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 11
Всего: 43



Цитата(StormDK @ 5.4.2007,  17:56)


Цитата

По-мойму красивая идея 


Да. У нас один компонент медленно работал. Полезли туда. А там что-то вроде findGlobalProvider каждый раз вызывается. Разработчик на все случаи жизни нетленку сделал. Как учили.
PM MAIL   Вверх
StormDK
Дата 26.4.2007, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 5.4.2007

Репутация: нет
Всего: нет



А объясните, пожалуйста, вот что:

Если получили мы ссылку на удалённый объект и вызвали его метод:
Код

Calculator c = (Calculator) Naming.lookup( "rmi://SpecMashina/str"); 
c.method();

а метод method(); возвращает, например, String - то всё нормально работает, а если он должен возвратить экземпляр некого нашего класса - то имеем MarshallException.

Т.е. вопрос: как сделать так, чтоб метод удалённого объекта мог возвращать экземпляр некого нашего класса?

PM MAIL   Вверх
LSD
Дата 26.4.2007, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 19
Всего: 538



Цитата(StormDK @  26.4.2007,  21:07 Найти цитируемый пост)
Т.е. вопрос: как сделать так, чтоб метод удалённого объекта мог возвращать экземпляр некого нашего класса?

Класс олжен реализовывать интерфейс java.io.Serializable.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Работа с сетью | Следующая тема »


 




[ Время генерации скрипта: 0.0589 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.