2014-02-12 3 views
2

Я работаю над java-приложением, основанным на сокетах. Он извлекает экран клиента и показывает его в графическом интерфейсе на сервере. Но проблема в том, что он просто показывает экран клиента в программа времени была запущена и не меняет ее. Вот мой код Server Side:Мгновенный захват экрана Java

try { 
    img = ImageIO.read(socket.getInputStream()); 

    while(true){ 
     ImageIcon icon = new ImageIcon(img); 
     label.setIcon(icon); 
    } 
} 
catch (IOException e) {} 

стороне клиента:

public class Client{ 

    public static void main(String[] args) throws Exception{ 

BufferedImage screenShot = new Robot().createScreenCapture(new   
Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
ImageIO.write(screenShot, "PNG", socket.getOutputStream()); 
    public static void main(String[] args) throws Exception{ 
    Socket socket = new Socket("localhost",1999); 
    Chat chat = new Chat(socket);  
    Thread thread = new Thread(chat); 
    thread.start(); 
}  
} 


class Chat implements Runnable{ 
private Socket socket; 

public Chat(Socket socket){ 
    this.socket = socket; 

} 

@Override 
public void run() { 
    // TODO Auto-generated method stub 
    try{ while(true){ 
    BufferedImage screenShot = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize())); 
    ImageIO.write(screenShot, "PNG", socket.getOutputStream()); 
    }}catch(Exception e){} 


}} 

ОШИБКА: -
Исключение в потоке "Thread-3" java.lang.IndexOutOfBoundsException
at javax.imageio.stream.FileCacheImageOutputStream.seek (Неизвестный источник)
на javax.imageio.stream.FileCacheImageOutputStream.close (Unknown Source)
в com.sun.imageio.stream.StreamCloser $ CloseAction.performAction (Unknown Source)
в com.sun.imageio.stream.StreamCloser $ 1.Run (Unknown Source)
на java.lang.Thread.run (Unknown Source)
UPDATE:
на самом деле я закрывал сокет еще до соединения был устанавливающее, который вызывает ошибку. Код Else Nick просто работал нормально.

+0

вы просто читать и писать изображение один раз? сделайте это в петле! (перемещайтесь на сервере imageio.read в цикле, у клиентов - полная функциональность screencapture!). Может быть, в таймере с 5 секундами –

+0

U mean i shud add While (true) loop в файле на стороне клиента? – Cybershadow

+0

Да, иначе вы загружаете только один снимок экрана, потому что код выполняется только один раз. на сервере вам нужно чаще читать сокет (создать таймер с 5 секунд или около того ...). –

ответ

1

Поскольку неясно, я хочу убедиться, что вы создали новый поток, на котором запущен вызов ImageIO.read; Эта строка, скорее всего, заблокирует поток, пока что-то не будет отправлено для чтения. Вы делаете не хотите, чтобы это выполнялось на EDT.

Предполагая, что у вас есть это, я предлагаю вам использовать SwingUtilities.invokeLater для обновления графического интерфейса. Это стандартный процесс - то, что он делает, это перенос обновления в очередь, поэтому в следующий раз, когда GUI хочет обновить, он знает, что делать.

Так в целом, ваш код должен выглядеть следующим образом:

Thread awesomeThread = new Thread(new Runnable(){ 

    @Override 
    public void run() { 
     while(true){ 

      try{ 
       //Read the image 
       final Image img = ImageIO.read(socket.getInputStream()); 
       System.out.println("Image Read"); //code for troubleshooting 

       //Once an image is read, notify the GUI to update 
       SwingUtilities.invokeLater(new Runnable(){ 
        @Override 
        public void run() { 
         ImageIcon icon = new ImageIcon(img); 
         label.setIcon(icon); 
         System.out.println("Image updated"); //code for troubleshooting 
        }}); 
      } catch (IOException e) {} 
     } 
    }}); 

    awesomeThread.start(); 
+0

Хорошо, теперь я получаю new Exception, java.lang.IndexOutOfBoundsException в строке ImageIo.write в файле на стороне клиента. Что может быть причиной этого? – Cybershadow

+0

Я не вижу никакого кода в вашем примере, который имеет отношение к индексам, поэтому я подозреваю, что вам нужно отправить больше кода. Но это, скорее всего, связано с массивом или с массивом ArrayList. Проверяет ли трассировка стека ваш код в любой точке? Это должно дать вам линию, которая вызывает проблемы. –

+0

Фактически стек не дает строки. Он просто говорит об исключении в thread-3 – Cybershadow

Смежные вопросы