Bild über Socket schicken - Client/Server

Ghorki

Aktives Mitglied
Hallo Leute,

ich möchte mich in der Netzwerkprogrammierung ein bisschen weiterbilden.
Mein Ziel ist es ein kleines Tool zu schreiben, dass die funktionsweiße des Teamviewer hat.

Der Server macht einen Screenshot vom Desktop und soll diese über den Socket an den Client schicken.
Momentan sieht meine Methode auf dem Server so aus:

Java:
public void screenshotErstellenUndVerschicken(BufferedImage imgage) {   
     try {
        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();	
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();	
        Rectangle screenRectangle = new Rectangle(screenSize); 			
        Robot robot = new Robot();
        imgage=robot.createScreenCapture(new Rectangle(screenRectangle));
        ImageIO.write(imgage,"png",byteArrayOutputStream);			
     } catch (Exception e) {
        e.printStackTrace();
     }
}

Mein Problem liegt darin, dass ich nicht genau weiß
(habe schon vieles versucht, aber bisher ohne Erfolg), :rtfm:
wie ich das Bild auf dem Client wiederherstellen und abspeichern kann.

Leider hat mir Google bisher nicht weitergeholfen.
Ich hoffe ihr könnt mir weiterhelfen. :toll:

Viele Grüße
Ghorki
 
A

annonymous

Gast
Hallo,
wenn ich dich richtig verstanden habe, versuchst du einen SocketServer zu programmieren.
Anbei ein kleines Beispiel:

Server:
Java:
public class SocketServer{
    public static void main(String[] args) throws Exception {
	ServerSocket serverSocket = new ServerSocket(10000);

	while (true) {
	    Socket socket = serverSocket.accept();
	    System.out.println("Connection established with " + socket);
	    ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
	    Object object = ois.readObject();
        MyObject myObject = (MyObject) object;
            // Bild uebertragen
        }
    }
}

Client:
Java:
public class Client {
    public static void main(String[] args) throws Exception{
        Socket socket = new Socket("localhost", 10000);
        ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
	    os.writeObject(myObject);
	    socket.close();
    }
 

Ghorki

Aktives Mitglied
Die Verbindung zwischen Server und Client steht ja schon,
es geht mir ausschließlich nur darum,
das ByteArray auf dem Client wieder in ein png zu wandeln und abzuspeichern.
 
A

annonymous

Gast
Hallo,

ich konnte meine Lösung gerade nicht ausprobieren, aber theoretisch sollte das so funktionieren:

Java:
public class NewClass {
    public static void main(String[] args) throws Exception{
        byte[] bytes = new byte[]{};
        ByteArrayInputStream bis = new ByteArrayInputStream(bytes);
        ImageInputStream iis = ImageIO.createImageInputStream(bis);
        
        Iterator itr = ImageIO.getImageReadersByFormatName("png");
        ImageReader imageReader = (ImageReader) itr.next();        
        imageReader.setInput(iis);
 
        Image image = imageReader.read(0);
        BufferedImage bufferedImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        ImageIO.write(bufferedImage, "png", new File("C:\\newImage.png"));
    }
}

PS: Würdest du den ObjectStream anstelle des ByteArrayStreams verwenden, solltest du auf der Gegenseite das Bild einfach wieder in BufferedImage casten können und speicherst es, indem du die folgende Zeile verwendest:

Java:
ImageIO.write(bufferedImage, "png", new File("C:\\newImage.png"));
 
A

annonymous

Gast
vielleicht noch einfacherer ist, den ByteArrayInputStream in ImageIO.read packen ...
Wenn du das lokal testest geht es ... es scheint so, als wenn deine generierter dann nicht den korrekten png Header besitzt.


Java:
        BufferedImage bufferedImage = ImageIO.read(new FileInputStream("c:\\Temp\\Screen.PNG"));
        ImageIO.write(bufferedImage, "png", new File("c:\\Temp\\newImage.png"));
 
A

annonymous

Gast
Ich habe das ganze nachgestellt, folgender Code funktioniert auf jeden Fall ohne Socket.
Ist es möglich, das du die Bytes nicht vollständig oder verändert über die Leitung schickst?!

Java:
    public static void main(String[] args) throws Exception{        
        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
        BufferedImage screenshot = new Robot().createScreenCapture(new Rectangle(screenSize));
        ImageIO.write(screenshot,"png",new File("c:\\Temp\\myScreen.png"));
        
        BufferedImage bufferedImage = ImageIO.read(new FileInputStream("c:\\Temp\\myScreen.png"));
        ImageIO.write(bufferedImage, "png", new File("c:\\Temp\\newImage.png"));
    }
 

Ghorki

Aktives Mitglied
Ich glaube ich bin gerade ein wenig durcheinander gekommen (noch schlimmer als vorher ;( ).
Jedenfalls hab ich die Exception wegbekommen:
Die Übertragung vom Server auf den Client sollte doch so funktionieren oder?

Server:

Java:
public void screenshotErstellen(){   
     try {
          ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
          Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();    
          BufferedImage screenshot = new Robot().createScreenCapture(new Rectangle(screenSize));
          Rectangle screenRectangle = new Rectangle(screenSize); 	
          Robot robot = new Robot();
          screenshot = robot.createScreenCapture(new Rectangle(screenRectangle));
          ImageIO.write(screenshot,"png",oos);			
     } catch (Exception e) {
          e.printStackTrace();
     }
}

Client:

Java:
public class ErwarteScreenShotVomServer_Thread implements Runnable {
     public void run() {
          try {
               while(true){
                     // 
               }
          } catch (Exception e) {
               e.printStackTrace();  
          }
}


** Jedenfalls speichert er auf der ServerSeite das Bild ab, nur soll das ganze auf der ClientSeite gespeichert werden.
ImageIO.write(screenshot, "png", new File("d:\\*\\Desktop\\tool\\newImage.png"));

** Ich habe ja schon eine Verbindung vom Client --> Server, um Nachrichten zu verschicken.
Kann es sein das ich da iwie in eine Komplikation mit dem Socket komme?
 
Zuletzt bearbeitet:
A

annonymous

Gast
Hallo,

dann solltest du auf dem Server den Screenshot machen und auf den OutputStream legen, so dass der Client die Daten an seinem InputStream lesen kann.
Alternativ kann der Client gezielt eine Anfrage nach einem Screenshot stellen und der Server sendet diesen zurück.

Vielleicht hilft dir der Link weiter: http://www.digilife.be/quickreferences/pt/java%20sockets.pdf

Der Client-Code wäre alternativ auch nicht schlecht, dann kann man das durchaus mal ausprobieren ...
 
J

JohannisderKaeufer

Gast
Ich persönlich würde folgendes machen.

Zuerst würde ich das erstellen des Screenshots in einer Klasse zusammenfassen, das mir Screenshots als byte[] zurückliefert.

Java:
import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.imageio.ImageIO;

/** Hilfsklasse zum erstellen von Screenshots */
public class Screenshottool {
	/** @return Bild als png in Form eines byte[] */
	public static byte[] getScreenshot() {
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		try {
			BufferedImage image = new Robot().createScreenCapture(new Rectangle(screenSize));
			ByteArrayOutputStream bos = new ByteArrayOutputStream();
			ImageIO.write(image, "png", bos);

			return bos.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (AWTException e) {
			e.printStackTrace();
		}
		return null;
	}
}

Als nächstes würde ich, wenn es möglich ist einfach Messages schicken. Das hat zwar mehr Overhead als die bytes direkt zu schicken, finde ich aber um einiges wartbarer, nachvollziehbarer.

Java:
import java.io.Serializable;

public class ImageMessage implements Serializable {

	private byte[] image;

	public ImageMessage() {
	}

	public ImageMessage(byte[] image) {
		super();
		this.image = image;
	}

	public byte[] getImage() {
		return image;
	}

	public void setImage(byte[] image) {
		this.image = image;
	}
}

Wenn der Server die Screenshots bei sich auf dem Rechner machen soll, dann kann das so aussehen
Java:
private void sendScreenshotToAllClients(){
	byte[] data = Screenshottool.getScreenshot();
	ImageMessage message = new ImageMessage(data);
	for(Client c: clients){
		ObjectOutputStream out = c.getObjectOutputStream();
		sendScreenshot(message, out);
	}
}

private void sendScreenshot(ImageMessage message, ObjectOutputStream out){
	try{
		out.writeObject(message);
		out.flush();
	} catch (IOException e) {
		e.printStackTrace();
	}
}

Und auf dem Client kann man dann einen Thread laufen lassen, der die Nachrichten entgegennimmt.
Java:
@Override
public void run() {
	try {
		ObjectInputStream stream = new ObjectInputStream(socket.getInputStream());
		Message message = null;
		while ((message = (Message) stream.readObject()) != null) {
			if(message instanceof ImageMessage){
				processImageMessage((ImageMessage) message);
			}
		}
	} catch (IOException e) {
		e.printStackTrace();
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
}

private void processImageMessage(ImageMessage message){
	//Add Image to gui
	ImageIcon icon = new ImageIcon(message.getImage());
	gui.add(new JLabel(icon));
	//Save image timestamp.png
	FileOutputStream fos;
	try {
			fos = new FileOutputStream(System.currentTimeMillis()+".png");
			fos.write(message.getImage());
	} catch (FileNotFoundException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Bild URL über ImageIO.read Netzwerkprogrammierung 8
P HTTP Bild von einem Server per http kopieren Netzwerkprogrammierung 1
M bild von einer url erzeugen Netzwerkprogrammierung 7
A HTTP Bild downloaden Netzwerkprogrammierung 3
J HTTP Bild an Client schicken mit com.sun.net.httpserver Netzwerkprogrammierung 5
S Bild-Datei von Servlet an Browser senden Netzwerkprogrammierung 8
G Bild aus PHP-seite speichern Netzwerkprogrammierung 7
A Webserver - Bild senden Netzwerkprogrammierung 2
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9
J FTP FTP Zugriff über Proxy Server Netzwerkprogrammierung 1
Thallius Java Application über ZScaler benutzer? Netzwerkprogrammierung 0
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
V einfaches hin und her von Text über Server Netzwerkprogrammierung 2
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
antonbracke Multiuser Software über XMPP Server Netzwerkprogrammierung 1
Z Verbindung zwischen 2 Rechnern über ServerSockets nicht möglich Netzwerkprogrammierung 3
cezary Socket ServerSocket starten über GUIIm unterstehenden Code versuche Netzwerkprogrammierung 6
I ASCII über serielle Schnittstelle Netzwerkprogrammierung 1
N RMI "RMI über Lan funktioniert nicht" & "RMI-Server im Lan scannen" Netzwerkprogrammierung 13
L Mit Java über PHP in MySQL anmelden (Login script) Netzwerkprogrammierung 3
M Socket String Arrays über Socket an Server schicken Netzwerkprogrammierung 2
T Socket Methoden über Internet aufrufen Netzwerkprogrammierung 1
S Socket Kommunikation über Internet Netzwerkprogrammierung 1
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
P RMI Threads die über RMI auf Datenbank zugreifen Netzwerkprogrammierung 2
S Datei schreiben über Applet Netzwerkprogrammierung 8
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
J Erster Server-Client läuft auf lokalem Rechner problemlos. Zwei Rechner über das Internet nicht Netzwerkprogrammierung 8
Kjubert Synchronisieren von Objekten über Client/Server - bester Weg? Netzwerkprogrammierung 7
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
H Socket Objekte über Socket? Allgemeine Verständnisprobleme in Sachen Socket Netzwerkprogrammierung 3
S Seltsames Verhalten beim Empfangen von Daten über DataInputStream Netzwerkprogrammierung 12
A TCP über UDP Verbindung? Netzwerkprogrammierung 10
C Datei über Socket schreiben und Ereignis lesen Netzwerkprogrammierung 9
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
D JNLP über Webstart funktioniert nicht... Netzwerkprogrammierung 2
J Socket Dateien über Socket auf Server speichern Netzwerkprogrammierung 3
D Socket Datei nur stückweise über Socket verschicken Netzwerkprogrammierung 6
A Computer über Internet verbinden Netzwerkprogrammierung 12
N über Java in eine Text-Datei auf einem Server schreiben Netzwerkprogrammierung 2
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
S Socket Verschiedene Exceptions beim Übertragen von Bildern über Socket Netzwerkprogrammierung 20
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
C Verbindung zu einem Hostrechner über das Internet herstellen Netzwerkprogrammierung 15
M Map über Webservice übertragen Netzwerkprogrammierung 3
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
P Socket Verbindung über das Internet Netzwerkprogrammierung 2
Z Socket Connection reset by peer nur per IP nicht über localhost Netzwerkprogrammierung 13
ruffio1978 Telnet über ein socket ansprechen Netzwerkprogrammierung 8
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
G Klassen über JMX per URLClassloader laden? Netzwerkprogrammierung 2
E Zwei PCs über das Internet miteinander verbinden? Netzwerkprogrammierung 3
E Socketverbindung über das Internet - Timeout? Netzwerkprogrammierung 28
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
E Java über Socket ins Internet? Netzwerkprogrammierung 4
F Socket Daten über verschiedene IP's schicken Netzwerkprogrammierung 5
M Socket JavaProg über einen Clienten steuern Netzwerkprogrammierung 5
M Mail über Exchange versenden Netzwerkprogrammierung 13
F C/S über HTTPS Netzwerkprogrammierung 2
D ...class.getResourceAsStream("/meine.properties") funktioniert nicht über RMI? Netzwerkprogrammierung 3
M ganymed-ssh2.har: ftp-Verbindung über ftp-Proxy Netzwerkprogrammierung 2
J Probleme bei RSA mit byte[] bei Versand über RMI Netzwerkprogrammierung 2
Z File über Socket lesen Netzwerkprogrammierung 3
A HTTP Binärdaten über PHP-Skript in Datenbank schreiben bzw auslesen Netzwerkprogrammierung 2
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
P FTP isFile() über FTP Netzwerkprogrammierung 3
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
M Objekt über socket senden/empfangen Netzwerkprogrammierung 3
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
A UCP Connection über Proxy möglich? Netzwerkprogrammierung 7
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
F Char über Netzwerk senden Netzwerkprogrammierung 6
S HTTP Login mit CAS Authentisierung über SSL Netzwerkprogrammierung 2
C Befehle über ein GUI an Server senden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
I Objekte über das Netzwerk Netzwerkprogrammierung 5
M Google Translate über Java ansprechen? Netzwerkprogrammierung 13

Ähnliche Java Themen

Neue Themen


Oben