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


Опытный
**


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

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



Цитата(unkis @ 10.10.2006,  12:11)
я конечно же попробую, но мне непонятно причём может быть это.

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

При чем факский пример - работает. При этом там особо отмечено как именно клиент должен получать ссылку на заглушку.


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


Опытный
**


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

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



я не про это пример, а про этот http://vingrad.ru/JAVA-JAV-000103


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


software saboteur
****


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

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



попробуйте поменять строку:
Код

Naming.rebind("//127.0.0.1/RemoteCanvas", obj);


на 
Код

Naming.rebind("rmi://localhost:" + port + "/RemoteCanvas", obj);


где port - это порт  который слушает rmi registry 


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

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


Опытный
**


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

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



Цитата(unkis @ 10.10.2006,  13:59)
я не про это пример, а про этот http://vingrad.ru/JAVA-JAV-000103

А сам по себе пример работает - если сделать один в один как там написано?


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


Опытный
**


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

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



да я пробывал в институте этот пример работал.

ну это все не важно.

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

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

Код

while(beskonechno){
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();
        }
}


я тут так попробывал, так ЦПУ грузится на 100%,  думаю что это не правенльно.

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







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


Leprechaun Software Developer
****


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

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



Цитата(unkis @  10.10.2006,  21:20 Найти цитируемый пост)
я тут так попробывал, так ЦПУ грузится на 100%,  думаю что это не правенльно.

Ну так у тебя пауза между опросами не делается. Добавь в конец цикла:
Код
Thread.sleep(3000);



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


Опытный
**


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

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



Ребята теперь слудующая проблемма.

на сервеере есть Vector<Point2d.Double> points;

и к этому вектору есть также get и add методы.

так вот, когда клиент1 вызывает метод add проблем не возникает, но когда одновременно при этом клиет2 вызывает метод get то выбрасывается ошибка. 

Код

java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.awt.geom.Point2D$Double
    at sun.rmi.server.UnicastRef.invoke(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unknown Source)
    at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source)
    at $Proxy0.getPoints(Unknown Source)
    at de.rmi.Client2.run(Client2.java:47)
Caused by: java.io.WriteAbortedException: writing aborted; java.io.NotSerializableException: java.awt.geom.Point2D$Double
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readArray(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.defaultReadFields(Unknown Source)
    at java.io.ObjectInputStream.readSerialData(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at sun.rmi.server.UnicastRef.unmarshalValue(Unknown Source)


Причем когда просто запускется клент2 без клиет1, то все впорядки, тоесть я так понимаю что получается какая-то колизия?

Что мне делать, и как это исправить?

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

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 {
        System.out.println("Old modify: "+modify+" \tNew modify: "+change);
        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();
        }
    }

    public void addPoint(int x, int y) throws RemoteException {
        points.add(new Point2D.Double(x,y));
        
    }

}



Клиент1
вот так вот вызывается метод add
Код

public void mouseMoved(MouseEvent e) {
        int x=e.getX(), y = e.getY();
        try {
            obj.addPoint(x, y);
            
        } catch (Exception e1) {
            System.out.println("Clien err: " + e1.getMessage());
            e1.printStackTrace();
        }
        System.out.println("rabotaju ["+x+","+y+"]");
        
    }


Клиент2
Код

public void run() {
        while (!Client2.exit) {
            try {
                System.out.println("Size = "+obj.getPoints().size());
                
                Thread.sleep(150);
            } catch (Exception e) {
                
                e.printStackTrace();
            }
            
        }
    }


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



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


Leprechaun Software Developer
****


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

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



Зачем ты используешь Point2D.Double? Используй Point.

Цитата(unkis @  12.10.2006,  12:11 Найти цитируемый пост)
Причем когда просто запускется клент2 без клиет1, то все впорядки, тоесть я так понимаю что получается какая-то колизия?

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


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


Опытный
**


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

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



Цитата(LSD @ 12.10.2006,  11:25)
передаваемые данные не сериализуемы.

огда бы у него и первый клиент не работал бы имхо..


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


Опытный
**


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

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



хорошо, а как мне их сериализовать надо?

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


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


Leprechaun Software Developer
****


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

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



Первый клиент вызывает метод addPoint() который никаких Point2D.Double не передает и не получает. А второй клиент вызывает getPoints() который получает коллекцию Point2D.Double, причем если она пустая то ошибок тоже не будет, т.к. нечего там сериализовывать.

Проверь будет ли работать метод setPoints() с непустой коллекцией.

Добавлено @ 12:06 
Цитата(unkis @  12.10.2006,  12:38 Найти цитируемый пост)
хорошо, а как мне их сериализовать надо?

Используй java.awt.Point.


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


Опытный
**


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

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



подождите как это не передаёт, а это что?

Код

public void mouseMoved(MouseEvent e) {
        int x=e.getX(), y = e.getY();
        try {

            obj.addPoint(x, y); //вот здесь идёт передача координат
            
        } catch (Exception e1) {
            System.out.println("Clien err: " + e1.getMessage());
            e1.printStackTrace();
        }
        System.out.println("rabotaju ["+x+","+y+"]");
        
    }



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


Leprechaun Software Developer
****


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

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



Цитата(unkis @  12.10.2006,  13:08 Найти цитируемый пост)
подождите как это не передаёт, а это что?

Еще раз:
Цитата(LSD @  12.10.2006,  13:05 Найти цитируемый пост)
Первый клиент вызывает метод addPoint() который никаких Point2D.Double не передает и не получает.

Если ты внимательно посмотришь на метод, то увидишь, что он передает два int, и ни одного Point2D.Double.

Добавлено @ 12:17 
Кстати очень странное архитектурное решение, в одну сторону передаем int в другую Point. Надо что-то одно использовать.


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


Опытный
**


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

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



Поменял везде на Point и передовать стал Point а не int, и всё сразу заработало.

Спасибо поехали дальше


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


Опытный
**


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

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



Ребята столкнулся вот с такой ошибкой.
Почему у меня не получается  передать на сервер BufferedImage?
Связано ето как-то с сереализацией? если да то как мне его сереалезировать и передать?
Код


java.rmi.MarshalException: error marshalling arguments; nested exception is: 
    java.io.NotSerializableException: java.awt.image.BufferedImage
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:122)
    at de.rmi.ServerCanvasRemote_Stub.setScreenshot(Unknown Source)
    at de.rmi.Client2.mouseSingleClick(Unknown Source)
    at de.rmi.Client2.mouseClicked(Unknown Source)
    at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:212)
    at java.awt.Component.processMouseEvent(Component.java:5491)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)Single
Single

    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3901)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1778)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
Caused by: java.io.NotSerializableException: java.awt.image.BufferedImage
    at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1081)
    at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:302)
    at sun.rmi.server.UnicastRef.marshalValue(UnicastRef.java:258)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:117)


вот так он прописан в серверной части
Код

public class ServerCanvasRemote extends UnicastRemoteObject implements CanvsInterface {
...............
..................
private BufferedImage img;
    
    
    protected ServerCanvasRemote() throws RemoteException {
        
        super();
        
        
    }

       public BufferedImage getScreenshot() throws RemoteException {
        
        return img;
    }

    public void setScreenshot(BufferedImage scren) throws RemoteException {
        img = scren;
        
    }
.........
........


вот так я его питаюсь передать с клиента на сервер
Код

        a = new Robot();
    screen = a.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height));
                obj.setScreenshot(screen);


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


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


Leprechaun Software Developer
****


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

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



BufferedImage не сериализуем. Унаследуй от класса BufferedImage:
Код
public class MyBufferedImage extends BufferedImage implements 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   Вверх
unkis
Дата 27.10.2006, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



не совсем понятно, можно немножко по подробней?


А! помоему понял сейчас попробую

Это сообщение отредактировал(а) unkis - 27.10.2006, 22:17


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


Leprechaun Software Developer
****


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

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



Код
  public static void main(String[] args)
  {
    try
    {
      MyBufferedImage image = new MyBufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
      ObjectOutputStream out = new ObjectOutputStream(new ByteArrayOutputStream(1024 * 1024));
      out.writeObject(image);
      out.close();
      System.out.println("OK");
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }

  private static class MyBufferedImage extends BufferedImage implements Serializable
  {
    public MyBufferedImage(int width, int height, int imageType)
    {
      super(width, height, imageType);
    }

    public MyBufferedImage(int width, int height, int imageType, IndexColorModel cm)
    {
      super(width, height, imageType, cm);
    }

    public MyBufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?, ?> properties)
    {
      super(cm, raster, isRasterPremultiplied, properties);
    }
  }



--------------------
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
Дата 27.10.2006, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



хм..
что-то не получается
возникает такая ошибка
Код

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.awt.image.BufferedImage
    at de.rmi.Client2.mouseSingleClick(Client2.java:141)
    at de.rmi.Client2.mouseClicked(Client2.java:114)
    at java.awt.AWTEventMulticaster.mouseClicked(AWTEventMulticaster.java:212)
    at java.awt.Component.processMouseEvent(Component.java:5491)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3126)
    at java.awt.Component.processEvent(Component.java:5253)
    at java.awt.Container.processEvent(Container.java:1966)
    at java.awt.Component.dispatchEventImpl(Component.java:3955)
    at java.awt.Container.dispatchEventImpl(Container.java:2024)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4212)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3901)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3822)
    at java.awt.Container.dispatchEventImpl(Container.java:2010)
    at java.awt.Window.dispatchEventImpl(Window.java:1778)
    at java.awt.Component.dispatchEvent(Component.java:3803)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)

в етом месте.

Код

screen = (MyBufferedImage) a.createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize().width,Toolkit.getDefaultToolkit().getScreenSize().height));
                obj.setScreenshot(screen);


что- то я делаю не то?


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


Leprechaun Software Developer
****


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

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



Проблема в том, что объект Image создаешь не ты, поэтому используется не твой класс, а стандартный BufferedImage. Тут я вижу два варианта.
Первый:
Код
  public static void main(String[] args)
  {
    try
    {
      BufferedImage img = ImageIO.read(new File("image.jpg"));
      MyBufferedImage image = new MyBufferedImage(img.getWidth(), img.getHeight(), img.getType());
      image.getGraphics().drawImage(img, 0, 0, null);
      ObjectOutputStream out = new ObjectOutputStream(new ByteArrayOutputStream(1024 * 1024));
      out.writeObject(image);
      out.close();
      System.out.println("OK");
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }

Второй:
Код
  public static void main(String[] args)
  {
    try
    {
      BufferedImage image = ImageIO.read(new File("C:\\TMP\\Themes\\1W.jpg"));
      ByteArrayOutputStream baos = new ByteArrayOutputStream();
      ImageIO.write(image, "bmp", baos);
      ObjectOutputStream out = new ObjectOutputStream(new ByteArrayOutputStream(1024 * 1024));
      out.writeObject(baos.toByteArray());
      out.close();
      System.out.println("OK");
    }
    catch(Exception e)
    {
      e.printStackTrace();
    }
  }

потестируй что будет быстрее работать.


--------------------
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
Дата 28.10.2006, 03:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Спасибо за ответ, вибрал первий вариант.

теперь что-то на сервере не так.

выдает вот такую вот ошибку.

Код

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.io.InvalidClassException: de.rmi.MyBufferedImage; no valid constructor
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source)
    at sun.rmi.transport.Transport$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
    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:126)
    at de.rmi.ServerCanvasRemote_Stub.setScreenshot(Unknown Source)
    at de.rmi.Client2.mouseSingleClick(Client2.java:145)
    at de.rmi.Client2.mouseClicked(Client2.java:114)


вот мой код вызова серверного метода
Код

a = new Robot();

                BufferedImage img = a.createScreenCapture(new Rectangle(Toolkit
                        .getDefaultToolkit().getScreenSize().width, Toolkit
                        .getDefaultToolkit().getScreenSize().height));
                screen = new MyBufferedImage(300, 300,
                        BufferedImage.TYPE_INT_RGB);
                screen.getGraphics().drawImage(img, 0, 0, null);
                obj.setScreenshot(screen);


вот мой серверний класс
Код

package de.rmi;

import java.awt.Point;
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<Point> points = new Vector<Point>();

    private boolean modify = false;

    private Point point1;

    private Point point2;

    private MyBufferedImage img;

    protected ServerCanvasRemote() throws RemoteException {

        super();

    }

    public Vector<Point> getPoints() throws RemoteException {
        return points;
    }

    public boolean hasModifyed() throws RemoteException {

        return modify;
    }

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

    }

    public void setModify(boolean change) throws RemoteException {
        System.out
                .println("Old modify: " + modify + " \tNew modify: " + change);
        modify = change;

    }

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

    public void addClickedPoint(Point point) throws RemoteException {
        points.add(point);

    }

    public void addMovededPoint(Point point1, Point point2)
            throws RemoteException {
        this.point1 = point1;
        this.point2 = point1;

    }

    public Point getMovedPoint1() throws RemoteException {

        return point1;
    }

    public Point getMovedPoint2() throws RemoteException {

        return point2;
    }

    public MyBufferedImage getScreenshot() throws RemoteException {

        return img;
    }

    public void setScreenshot(MyBufferedImage scren) throws RemoteException {
        img = scren;

    }

}



вот мой MyBufferedImage.java
Код

package de.rmi;

import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.WritableRaster;
import java.io.Serializable;
import java.util.Hashtable;

public class MyBufferedImage extends BufferedImage implements Serializable {

    /**
     * 
     */
    private static final long serialVersionUID = 4827876719146350339L;

    public MyBufferedImage(int width, int height, int imageType)
    {
      super(width, height, imageType);
    }
    public MyBufferedImage(int width, int height, int imageType, IndexColorModel cm)
    {
      super(width, height, imageType, cm);
    }
    public MyBufferedImage(ColorModel cm, WritableRaster raster, boolean isRasterPremultiplied, Hashtable<?, ?> properties)
    {
      super(cm, raster, isRasterPremultiplied, properties);
    }

}



Ну что ге ему еше не хвотает, что я делаю не так?

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


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


Leprechaun Software Developer
****


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

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



Цитата(unkis @  28.10.2006,  04:00 Найти цитируемый пост)
теперь что-то на сервере не так.

Ты уверен, что эта ошибка вываливается на сервере, а не на клиенте?


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


Опытный
**


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

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



Неуверен, но просто написанно

Код

ServerException: RemoteException occurred in server thread; nested exception is: 
.....
.....


и по дебагеру ошибка виподает на визове етого метода.
Код

obj.setScreenshot(screen);


а этот метод в свою очередь должен передовать MyBufferedimage na server.

так что думаю что на сервере что-то не так.

и еше не поныатно что-то написано типа
Код

java.io.InvalidClassException: de.rmi.MyBufferedImage; no valid constructor

что занчит нет подходящеги конструктора?

Это сообщение отредактировал(а) unkis - 28.10.2006, 03:27


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


Опытный
**


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

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



Ребята, так как всетаки передать картинку через сервер другому клиенту?

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


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


Leprechaun Software Developer
****


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

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



Цитата(unkis @ 28.10.2006,  04:27)
Неуверен, но просто написанно

Код

ServerException: RemoteException occurred in server thread; nested exception is: 
.....
.....

Да при чем тут это! У тебя есть два независимых приложения. Одно сервер, другое клиент, в консоли какого пишется эта ошибка?


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


Опытный
**


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

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



ошибка пишется в клиентской части при попытке передать катринку на сервер.
Код

a = new Robot();
                BufferedImage img = a.createScreenCapture(new Rectangle(Toolkit
                        .getDefaultToolkit().getScreenSize().width, Toolkit
                        .getDefaultToolkit().getScreenSize().height));
                screen = new MyBufferedImage(300, 300,
                        BufferedImage.TYPE_INT_RGB);
                screen.getGraphics().drawImage(img, 0, 0, null);
                obj.setScreenshot(screen);


вот именно при етом вызове


Код

  obj.setScreenshot(screen);




Это сообщение отредактировал(а) unkis - 28.10.2006, 11:35


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


Leprechaun Software Developer
****


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

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



Похоже что по человечески его не сериализовать, и придется использовать такой метод:
Код
Robot robot = new Robot();
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
BufferedImage img = robot.createScreenCapture(new Rectangle(screenSize.width, screenSize.height));
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 1024);
ImageIO.write(img, "PNG", baos);
byte[] data = baos.toByteArray();
baos.reset();

и передавать уже byte[].


--------------------
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
Дата 28.10.2006, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



спасибо заработало.

только конечно когда он делает скрин, то ресурсов жрет мног, жаль что нельзя передать на сервер объект BufferedImage.


Но всёравно спасибо.


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


Leprechaun Software Developer
****


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

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



BufferedImage памяти все равно больше будет занимать, чем byte[]. Единственное но, это время перекодирования.


--------------------
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
Дата 28.10.2006, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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




Цитата(LSD @  28.10.2006,  16:15 Найти цитируемый пост)
Единственное но, это время перекодирования


я думаю что оно как раз и жрёт много ресурсов.

 smile 
Скажите а можно сделать скриншот в месте с курсором мышки, а то получается без него?



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


Leprechaun Software Developer
****


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

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



Цитата(unkis @  28.10.2006,  17:32 Найти цитируемый пост)
я думаю что оно как раз и жрёт много ресурсов.

Выбери другой формат, например BMP. Это уменьшит время, но увеличит объем передаваемых данных.


Цитата(unkis @  28.10.2006,  17:32 Найти цитируемый пост)
Скажите а можно сделать скриншот в месте с курсором мышки, а то получается без него?

Средствами Java - нет.


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


software saboteur
****


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

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



Цитата(unkis @  28.10.2006,  17:32 Найти цитируемый пост)
Скажите а можно сделать скриншот в месте с курсором мышки, а то получается без него?

Думаю, что курсор придется прорисовывать самостоятельно, поскольку он не является частью экрана.
С другой строны ребята из Sun утверждают, что это баг и он зафиксин в Java 1.5. Чего я, кстати, не заметил...


Это сообщение отредактировал(а) powerOn - 28.10.2006, 17:05


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

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1046 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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