Java Screenshot direkt weiterleiten und nicht in Datei schreiben

CPU

Lieutenant
Registriert
Jan. 2006
Beiträge
704
Hallo zusammen,

folgendes: ich habe einen Client und einen Server. Der Client macht ein Screenshot und sendet den an den Server. Doch mit jetzigen Variante:
Code:
 Socket socket = null;
        try {
            socket = new Socket("localhost", 41001);
        } catch (UnknownHostException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        OutputStream ss = null;
        System.out.println("GOING TO SEND: " + System.nanoTime());
        try {
			BufferedImage bi = new Robot().createScreenCapture( 
				     new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()) );

			ImageIO.write( bi, "jpg", new File("c:/screenshot.jpg") );

        } catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} 
        
       File file = new File("c:/screenshot.jpg");

        try {
            DataOutputStream dos = new DataOutputStream(socket
                    .getOutputStream());

            FileInputStream fis = new FileInputStream(file);

            int i = 0;
            while ((i = fis.read()) != -1)
                dos.write(i);

            dos.flush();
            dos.close();
            fis.close();

        } catch (Exception e1) {
            e1.printStackTrace();
        }
dautert das aber über 5 Sekunden! Da das ein Streaming werden, wobei sekündlich ein Screenshot geschossen werden soll ist das ein bisschen schlecht!!!

Habt Ihr da Optimierungsmöglichkeiten Parat? (unten der Quellcode vom Server)

Außerdem fände ich es hilfreich, nicht erst das BufferedImage in eine Datei auf der Festplatte zu schreiben, sondern direkt zu versenden... wie geht das??

Danke schon mal vorab,
CPU

Code:
 try {
            ServerSocket serverSocket = new ServerSocket(41001);

            while (true) {
                Socket socket = serverSocket.accept();

                
                System.out.println("HERE: " + System.nanoTime());
                try {
                    File f=new File("C:\\test.png");
                    InputStream inputStream= socket.getInputStream();
                    OutputStream out=new FileOutputStream(f);
                    byte buf[]=new byte[1024];
                    int len;
                    while((len=inputStream.read(buf))>0)
                    out.write(buf,0,len);
                    out.close();
                    inputStream.close();
				} catch (Exception e) {
					e.printStackTrace();
				}
                
				System.out.println("OKAY: " + System.nanoTime());

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
 
Du kannst mit ImageIO auch direkt in den DataOutputStream schreiben, ohne Umweg auf die Platte:
Code:
ImageIO.write(bi, "jpg", dos);
 
Und wie bekomme ich
Code:
DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
und
Code:
OutputStream os = null;
try {
    ImageIO.write(buff, "png", os);
} catch(...) {}
zu einem Sinn?

Bin gerad irgendwie verwirrt! Denn ich will ja einen Stream in einen OutputStream schreiben (das Socket) und habe aber von ImageIO einen OutputStream. Und OutputStream und OutputStream gehen nicht zusammen!
 
Das ist jetzt ungetestet, aber so sollte es im Prinzip laufen (ohne Umweg über die Festplatte):
Code:
Socket socket = null;
try {
   socket = new Socket("localhost", 41001);
  System.out.println("GOING TO SEND: " + System.nanoTime());
  BufferedImage bi = new Robot().createScreenCapture(new Rectangle(Toolkit.getDefaultToolkit().getScreenSize()));
  ImageIO.write(bi, "jpg", socket.getOutputStream());
  System.out.println("SENT: " + System.nanoTime());
}
catch (Exception e1) {
   e1.printStackTrace();
}
Das ganze als Ersatz für den ersten geposteten Code.
 
Ich bin dumm! :D Da hätte ich auch gleich drauf kommen können ....

Noch eine eher theoretische Frage: was haltet Ihr für sinnvoller? Wenn ich die Screenshots via TCP oder via UDP versende?

Gruß,
CPU
 
naja tcp, da kannst du dann sicher sein dass die screenshots komplett ankommen. pakete bei udp werden nicht nochmal gesendet wenn sie verloren gehen.
 
Ja gut, aber bei UDP meine ich, dass es schneller geht - irgendwo mal gelesen. Aber bisher habe ich mit TCP gearbeitet, dann bleib ich einfach dabei! Danke! :):)

Vielen Dank für die netten Antworten! :D

====
EDIT:
Kann man nicht das Thema als Erledigt markieren? In den Sun-Foren geht das irgendwie.
 
udp ist auch schneller, teilweise eben auch gerade deswegen weil es verlorene daten nicht nochmal schickt. udp ist zb was für voip/skype usw. da hat es einfach keinen sinn verlorene daten nachzusenden, weil die zeit eh schon vergangen ist.
 
Zurück
Oben