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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с RMI приложением. 
:(
    Опции темы
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   Вверх
Страницы: (4) Все 1 2 [3] 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0699 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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