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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с RMI приложением. 
:(
    Опции темы
unkis
  Дата 9.10.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



У меня такая проблема. В институте профессор дал задания, написать приложение при помощи RMI, которое делала бы следующее:

Два приложения запускаются от 2 до n компьтерах и могут пользоватся одним canvas 2d для всех.
Тоесть если один рисует что-то у себя, то остальные сразу видять что он рисует, а также одновременно могут рисовать несколько пользователей. ну это что-то типо общего удаллённого Paint приложения в messenger.

Так вот у кого какие предложения для реализации такой проблемы?

Я так понимаю что серверная и клинтская часть должна находится у каждого пользователя, но я пока не силён в RMI и поэтому могу ошибаться.



Зарания благодарен.






--------------------
www.unkis.com
PM MAIL WWW   Вверх
3x3
Дата 9.10.2006, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Один сервер держит массив, соотв. пикселам канваса, экспортирует:
- метод который позволяет установить цвет для каждого пиксела
- метод который получить массив или его измененную с некоего момента (последнего запроса) часть.

Клиенты по таймеру (0.3 сек., напр.) дергают сервер на предмет обновлений, а если юзер чего рисует - апдейтят массив на сервере вызывая первый метод. Можно даже под AJAX такого клиента сделать.




--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
unkis
Дата 9.10.2006, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



такой вариант рассматривается, а нелзя как-нибудь что бы не клиенты дёргали сервер, а сервер дёргал клиентов когда есть обновления, таким оброзом добится снижения трафика и нагрузки на сервер.

Добавлено @ 16:43 
хотя тогда будет проблемма с файрволом


--------------------
www.unkis.com
PM MAIL WWW   Вверх
LSD
Дата 9.10.2006, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



В RMI всегда есть клиент и сервер и клиент вызывает методы сервера. В принципе каждый клиент может реализовать у себя и клиентскую и серверную часть. Но тут встанет вопрос, с тем где должна быть запущена 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   Вверх
unkis
Дата 9.10.2006, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Неужели icq и ему подобные клиенты постороины так что они каждое n времени дёргают сервер?
я думал что для сервера это не есть хорошо.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
LSD
Дата 9.10.2006, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



Цитата(unkis @  9.10.2006,  17:59 Найти цитируемый пост)
Неужели icq и ему подобные клиенты постороины так что они каждое n времени дёргают сервер?

Именно так и построены. К тому же там не один сервер стоит, их несколько и они делят между собой нагрузку.

Просто надо постараться минимизировать количество обращений к серверу, например передавать изменения не попиксельно а группами. Ну и сам сервер оптимизировать.


--------------------
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   Вверх
3x3
Дата 9.10.2006, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @ 9.10.2006,  17:03)
Просто надо постараться минимизировать количество обращений к серверу, например передавать изменения не попиксельно а группами. Ну и сам сервер оптимизировать.

Для курсовика - имхо это уже перебор.


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
3x3
Дата 9.10.2006, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(unkis @ 9.10.2006,  16:39)
Добавлено @ 16:43 
хотя тогда будет проблемма с файрволом

Вот именно.
Насколько я помню ВУЗ, то если твоя приблуда работает и делает то, что надо - это пять автоматом.
Если не работает - ну там уже идея оценивается и попытка её реализации, тоже может быть хорошая оценка, но уже придётся помучаться.

Плюс к тому, как правило окружение, где будет тестироваться твой софт - недружественное, чем ты кондовее сделаешь - тем лучше. Прога должна работать в любых условиях. Это чисто житейский совет, проверенный практикой. Например мы сдавали однажды курсовик по базам, сделанный на клиппере, и при этом так получилось, что этот курсовик я для 2/3 группы клепал.. На скорую руку, но так, что бы не попалить народ, что-б по-разному было сделано в некоторых специфических местах, по которым рука чувствуется. Ну и между делом себе тоже курсовик кропал - с ЕГА-графикой, библами на ассемблере для поддержки мыши, с графическим интро - на работе у меня было ненапряжно, вот и решил воспользоваться случаем освоить эту странную среду. В результате чего получилось? 
Я своих вперёд пропустил, что бы не портить впечатления. Все прошли на автомате, я дождался пока выставят оценки и стартанул своё детище. Гы. Оно не запустилось.. Начал смотреть чо как, пока рылся уже преподшу стошнило и она свалила, а потом оказалось, что у них в конфигсисе (это под досом ещё происходило всё) стоит совершенно непотребное ограничение на количество одновременно открытых файлов. Стал править - раздел защищен от записи (не помню уже как защита называлась, но тогда это модная приблуда была - запускалась резидентно с загрузочного сектора и не давала править загрузочный диск). Короче защиту пришлось преодолеть. Запустил свой шедевр - работает. Пошёл нашел преподшу, показал. ОК, говорит, а в чём дело было? Ну говорю, пришлось вашу идиотскую защиту ломать что бы конфигсис править. На этом месте меня чуть не отчислили, а потом типа сжалились и четвёрку поставили (все остальные мои курсовики тупо проканали на пять smile ). Короче мораль простая - простой код работает везде и всегда, а выпендреж выходит боком. Пиши так что бы не было возможности возникновения проблем, колбэки тебе не задавали.


Это сообщение отредактировал(а) 3x3 - 9.10.2006, 23:53


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
powerOn
Дата 9.10.2006, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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



Цитата(3x3 @  10.10.2006,  00:27 Найти цитируемый пост)
Для курсовика - имхо это уже перебор. 


Почему же? ИМХО ничего сложного, к примеру, простое сообщение об изменении будет содержать:
1) координаты изменяемой точки.
2) её новый цвет.

а если добавить еще радиус, то можно рисовать целыми кругами, центр которых в 1).

Я бы в качестве модели такой системы предложил иметь 1 координирующий сервер который будет общаться с клиентами по средствами RMI Callback-ов. Т.е. клиенты регистрируются, предоставляют серваку объект для обратного вызова. Сервер в свою очередь дергает клиентов по необходимости. Это исключает постоянные запросы клиентов : "Были изменеия? А может всетаки были? А если еще раз проверить? ...."

Это сообщение отредактировал(а) powerOn - 9.10.2006, 23:53


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
unkis
Дата 10.10.2006, 09:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нет, ребята это не на курсовик.
Профессор дал такое задания для тренировке, мол чтобы мы освоили азы RMI, а на экзамене он потом будет спрашивать, можно так сказать по этому проекту, но это всё лирика, вернёмся к вопросу.

я начал с самого простого примера и сразу столкнулся с такой вот ошибкой
Код

Server start
RemoteCanvase err: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: de.rmi.ServerCanvasRemote_Stub
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: de.rmi.ServerCanvasRemote_Stub
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:385)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
    at sun.rmi.transport.Transport$1.run(Transport.java:153)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
    at java.lang.Thread.run(Thread.java:595)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:247)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:223)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:343)
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
    at java.rmi.Naming.rebind(Naming.java:160)
    at de.rmi.ServerCanvasRemote.main(Unknown Source)
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: de.rmi.ServerCanvasRemote_Stub
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:375)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:240)
    at sun.rmi.transport.Transport$1.run(Transport.java:153)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:149)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:466)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:707)
    at java.lang.Thread.run(Thread.java:595)
Caused by: java.lang.ClassNotFoundException: de.rmi.ServerCanvasRemote_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:242)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:430)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1544)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1466)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1699)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1305)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:348)
    ... 9 more


хотя ServerCanvasRemote_Stub.class лежит там где и все class лежат
создавал я  его вот такой командой rmic de.rmi.ServerCanvasRemote
в чём проблема не могу понять?

вот мой интерфейс
Код

package de.rmi;
import java.awt.geom.Point2D;
import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.Vector;


public interface CanvsInterface extends Remote {
    
    Vector<Point2D.Double> getPoints() throws RemoteException;
    void setPoints(Vector<Point2D.Double> points) throws RemoteException;
    boolean hasModifyed() throws RemoteException;
    void setModify(boolean change) throws RemoteException;

}



вот моя серверная часть
Код

package de.rmi;

import java.awt.geom.Point2D;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;


public class ServerCanvasRemote extends UnicastRemoteObject implements CanvsInterface {

    /**
     * 
     */
    private static final long serialVersionUID = -3092163528354693698L;
    
    private Vector<Point2D.Double> points = new Vector<Point2D.Double>();
    
    private boolean modify = false;
    
    
    
    protected ServerCanvasRemote() throws RemoteException {
        super();
        
    }

    public Vector<Point2D.Double> getPoints() throws RemoteException {
        return points;
    }

    public boolean hasModifyed() throws RemoteException {
        
        return modify;
    }

    public void setPoints(Vector<Point2D.Double> points) throws RemoteException {
        this.points = points;
        
    }

    public void setModify(boolean change) throws RemoteException {
        modify = change;
        
    }
    
    public static void main(String[] args) {
        try {
            ServerCanvasRemote obj = new ServerCanvasRemote();
            System.out.println("Server start");
            Naming.rebind("//127.0.0.1/RemoteCanvas", obj);
            System.out.println("'RemoteCanvase' bound in registry");
        } catch (Exception e) {
            System.out.println("RemoteCanvase err: "+e.getMessage());
            e.printStackTrace();
        }
    }

}




вот моя клиентская часть
Код

package de.rmi;
import java.rmi.Naming;


public class Client {
    
    public static void main(String[] args) {
        try {
            CanvsInterface obj = (CanvsInterface) Naming.lookup("//127.0.0.1/RemoteCanvas");
            System.out.println("Probuem "+obj.hasModifyed());
        } catch (Exception e) {
            System.out.println("Clien err: " +e.getMessage());
            e.printStackTrace();
        }
    }

}


Это сообщение отредактировал(а) unkis - 10.10.2006, 10:18


--------------------
www.unkis.com
PM MAIL WWW   Вверх
3x3
Дата 10.10.2006, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(unkis @ 10.10.2006,  09:57)
вот моя серверная часть

А серверная ли это часть или просто определение класса который может вызываться через сервер?


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
unkis
Дата 10.10.2006, 10:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я несовсем понял вопрос, но этот класс я записываю в registry, поэтому он, насколько я понимаюи является сервером.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
LSD
Дата 10.10.2006, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


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

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



В параметрах запуска укажи нечто похожее:
Код
java -Djava.rmi.server.codebase=file:C:/Project/classes/ -Djava.security.policy=file:C:/Project/SimpleRMI.policy de.rmi.ServerCanvasRemote

И создай файл SimpleRMI.policy
Код
grant {
        // allows anyone to listen on un-privileged ports
        permission java.net.SocketPermission "*:1024-65535", "listen,accept,connect";
};



--------------------
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   Вверх
unkis
Дата 10.10.2006, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



я конечно же попробую, но мне непонятно причём может быть это.

Даже в FAQ на этом форуме простой пример безвсяких там полисов.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
unkis
Дата 10.10.2006, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



заработало, но почему без polyce не работало?

и расшефруяте пожалуйста, что означает ета строчка.
Код

java -Djava.rmi.server.codebase=file:C:/Project/classes/ -Djava.security.policy=file:C:/Project/SimpleRMI.policy de.rmi.ServerCanvasRemote


Теперь дальше.

для того чтоби клиент каждие 3 секунди спрашивал у сервера есть ли для ниго что-то, мне нужно бдет в отдельном треде делать что-то типо такого:
Код

try {
            CanvsInterface obj = (CanvsInterface) Naming.lookup("//127.0.0.1/RemoteCanvas");
           if(obj.hasModifyed()) //если есть изменения то виполняй
           {
            ..........
            ..........
            ..........
           }

        } catch (Exception e) {
            System.out.println("Clien err: " +e.getMessage());
            e.printStackTrace();
        }


Ето правильний подход, или может есть идеи по лучше?

Заранее благодарен.


--------------------
www.unkis.com
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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