Socket ImageIcon über Socket --> Fehler

F

Funkys

Gast
Hi,


Ich versuche mich gerade an einem Programm, das den Bildschirm aufnimmt (durch Robot.createScreenCapture()) und dann durch einen ObjectOutputStream verschickt. Auf dem Server wird er durch einen ObjectInputStream empfangen und auf das JPanel gezeichnet.
Mein Problem: Das Bild wird nicht angezeigt, das JFrame (JPanel) bleibt leer(weiß).

Als Test habe ich nun beim Server wie beim Client eine System.out.println() Anweisung hinzugefügt:

Client: System.out.println("Object gesendet: " + image.getImage());

Server: System.out.println("Object empfangen: " + image.getImage());

Dadurch habe ich bemerkt, dass es nicht das gleiche Bild ist.

Beim Client kommt das hier raus:
Object gesendet: BufferedImage@863399: type = 1 DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=0 IntegerInterleavedRaster: width = 1680 height = 1050 #Bands = 3 xOff = 0 yOff = 0 dataOffset[0] 0

beim Server jedoch nur noch: Object empfangen: sun.awt.image.ToolkitImage@119cca 4

Nun meine Frage: Woran liegt das und wie kann man es so machen, dass es geht??

MFG

PS: Hier der Quellcode:

Client:

Java:
package de.kuehne.writeimage;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class Client {

public static void main(String args[]) throws AWTException, IOException
{

new Client().los();

}

public void los() throws AWTException, IOException
{

Robot robot = new Robot();

Socket sock;

sock = new Socket("localhost", 5000);

Rectangle rect = new Rectangle();
Dimension dim = Toolkit.getDefaultToolkit().getSc reenSize();
rect.x = 0;
rect.y = 0;
rect.width = dim.width;
rect.height = dim.height;

ObjectOutputStream ob = new ObjectOutputStream(sock.getOutput Stream());

while (!Thread.interrupted())
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}

Image images = robot.createScreenCapture(rect);

ImageIcon image = new ImageIcon(images);

ob.writeObject(images);

System.out.println("Obj ect gesendet: " + image.getImage());

}

}

}

Server:

Java:
package de.kuehne.writeimage;

import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Server {

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

new Server().los();

}

public void los() throws IOException
{

ServerSocket sock = new ServerSocket(5000);

Socket socket = sock.accept();

ObjectInputStream in = new ObjectInputStream(socket.getInput Stream());

JFrame frame = new JFrame();
frame.setSize(500, 500);
frame.setVisible(true);
frame.setDefaultCloseOperatio n(JFrame.EXIT_ON_CLOSE);

JPanel panel = new JPanel();

frame.add(panel);

Graphics g = panel.getGraphics();

while (!Thread.interrupted())
{

try
{
ImageIcon image = (ImageIcon) in.readObject();

System.out.println("Ob ject empfangen: " + image.getImage());

Image images = image.getImage();

g.drawImage(images, 0, 0, null);

}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}

}

}

}
 

eRaaaa

Top Contributor
Also ein Problem ist sicherlich im Client die Zeile 59, da wolltest du doch sicherlich das ImageIcon , also [c]image[/c] verwenden?

Das zweite Problem könnte dann der Server sein, in Verbindung mit deiner Art zu zeichnen.
Probiere mal zu Testzwecken folgendes: (dirty ;>)

Java:
package de.kuehne.writeimage;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Server {
	public static void main(String args[]) throws IOException {
		new Server().los();
	}
	Image images;
	public void los() throws IOException {
		ServerSocket sock = new ServerSocket(5000);
		Socket socket = sock.accept();
		ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
		try {
			ImageIcon image = (ImageIcon) in.readObject();
			images = image.getImage();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		JFrame frame = new JFrame();
		JPanel panel = new JPanel() {
			{
				setPreferredSize(new Dimension(images.getWidth(null), images.getHeight(null)));
			}
			@Override
			protected void paintComponent(Graphics g) {
				g.drawImage(images, 0, 0, null);
			}
		};
		frame.add(panel);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 
F

Funkys

Gast
Also erstmal danke für die Antwort. Was ist denn eigetnlich falsch an Zeile 59?? Ich verschicke dort das ImageIcon. Un in diesem ist ja das Image, das ich brauche.
Ich habe deine Server-Class ausprobiert, hatte jedoch keinen Erfolg. Das Bild bleibt wie vorher unverändert.

MFG
 

andre111

Bekanntes Mitglied
Nein, du verschickst das Image selber:
Java:
Image images = robot.createScreenCapture(rect);
ImageIcon image = new ImageIcon(images);
ob.writeObject(images); // <-- hier wird das Image verschickt

lg andre111
 

eRaaaa

Top Contributor
Vllt. solltest du bessere Namen als image und images wählen, dann kommt man da auch nicht so schnell durcheinander ;) Ansonsten sollte dir doch aber auch eine Exception ala` NotSerializable um die Ohren fliegen oder? ;/
 
F

Funkys

Gast
nein tut mir leid habe hier irgendwie einen Schreibfehler reinbekommen... Also in eclipse steht alles richtig.
Und mit deiner Klasse ist es genauso bei System.out.println(image); : In der Client-Class wird wieder das mit dem BufferedImage ausgegeben. In der Server-Class nur noch sun.awt.image.ToolkitImage@119cca4. Und die Namen werde ich umändern :)
 

eRaaaa

Top Contributor
nein tut mir leid habe hier irgendwie einen Schreibfehler reinbekommen... Also in eclipse steht alles richtig.

Mhm, wie soll man dir dann konkret helfen, wenn du hier Code postet, der in deinem Eclipse aber ganz anders ist? Kannst du nicht vllt, mal ein kurzes Beispiel posten, welches man nachvollziehen kann?

Ich habe jetzt auch mal deinen Code, minus den angesprochenen Dingen, ausprobiert, hier läuft`s

Client:
Java:
package de.kuehne.writeimage;

import java.awt.AWTException;
import java.awt.Dimension;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.net.Socket;

import javax.swing.ImageIcon;

public class Client {
	public static void main(String args[]) throws AWTException, IOException {
		new Client().los();
	}

	public void los() throws AWTException, IOException {
		Robot robot = new Robot();
		Socket sock;
		sock = new Socket("localhost", 5000);
		Rectangle rect = new Rectangle();
		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
		rect.x = 0;
		rect.y = 0;
		rect.width = dim.width;
		rect.height = dim.height;
		ObjectOutputStream ob = new ObjectOutputStream(sock.getOutputStream());
		while (!Thread.interrupted()) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			Image images = robot.createScreenCapture(rect);
			ImageIcon image = new ImageIcon(images);
			ob.writeObject(image);
		}
	}
}

Server:
Java:
package de.kuehne.writeimage;

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.ServerSocket;
import java.net.Socket;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Server {
	public static void main(String args[]) throws IOException {
		new Server().los();
	}

	Image images;

	public void los() throws IOException {
		ServerSocket sock = new ServerSocket(5000);
		Socket socket = sock.accept();
		ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
		try {
			ImageIcon image = (ImageIcon) in.readObject();
			images = image.getImage();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
		JFrame frame = new JFrame();
		JPanel panel = new JPanel() {
			{
				setPreferredSize(new Dimension(images.getWidth(null)/2, images
						.getHeight(null)/2));
			}

			@Override
			protected void paintComponent(Graphics g) {
				g.drawImage(images, 0, 0, null);
			}
		};
		frame.add(panel);
		frame.pack();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
}
 
F

Funkys

Gast
Hi,

ich wusste nicht, ob ich jetzt ein neues Thema anfangen soll. Ich kann ja immernoch eins machen, wenn ich hier falsch bin :)

Also:

Das mit dem übertragen hat ja geklappt. Jetzt wollte ich jedoch viele Bilder machen und verschicken. Bei den ersten 30 Bilder geht es auch(im durchschnitt) jedoch kommt dann diese Exception:

Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space
at sun.awt.windows.WRobotPeer.getRGBPixels(Unknown Source)
at java.awt.Robot.createScreenCapture(Unknown Source)
at de.kuehne.sascha.CC.run(CC.java:1026)
at java.lang.Thread.run(Unknown Source)

Aber ich habe zwischen jedem Bild einen Thread.sleep(100) und einen Thread.yield Befehl drin. Eigentlich müsste das doch reichen, um nicht die Memory überlaufen zu lassen. Außerdem habe ich 8GB Ram DDR3. Dürfte eigentlich eh nicht so schnell passieren. Ich hoffe ihr könnt mir helfen :)

MFG
 

Geeeee

Bekanntes Mitglied
Dein Systemspeicher ist erstmal für die Katz. Deine VM bekommt ja Speicher zugewiesen (defaultmäßig ist das recht dürftig z.B. wie in deinem Fall bei der Bildverarbeitung).
Setz das mal etwas höher: -Xmx128M als Parameter mitgeben. Ich kann mir vorstellen, dass der GarbageCollector nicht so schnell deine Objekte löscht, wie du es gerne hättest.
 
F

Funkys

Gast
Dein Systemspeicher ist erstmal für die Katz. Deine VM bekommt ja Speicher zugewiesen (defaultmäßig ist das recht dürftig z.B. wie in deinem Fall bei der Bildverarbeitung).
Setz das mal etwas höher: -Xmx128M als Parameter mitgeben. Ich kann mir vorstellen, dass der GarbageCollector nicht so schnell deine Objekte löscht, wie du es gerne hättest.


Danke erstmal. Aber wo genau schreibt man denn -Xmx128M hin??
 
F

Funkys

Gast
Also ich habe jetzt ein bisschen gegooglet und auch ein paar sachen gefunden. Aber bei diesen muss man bei der Console o.ä. etwas eingeben, dass es so startet. Gibt es auch die Möglichkeit, ein Programm in Eclpise und oder als .jar Datei so zu schreiben, dass es gleich so viel Speicherplatz zur Verfügung stellt??
 
F

Funkys

Gast
Ich wollte fragen, ob es vielleicht auch noch eine andere Möglichkeit gibt, die weniger Ram verbraucht. Also mir ist aufgefallen, dass die OutOfMemoryError - Exception zwar immer bei createScreenCapture kommt, jedoch ohne ObjectOutputStream.writeObject() gar keine Meldung kommt. Da kann ich ohne sleep() und yield() 500 Bilder sofort hintereinander machen, ohne nur eine einzige Meldung zu bekommen. Kann es sein, dass es wirklich an writeObject() liegt?? Und wenn ja, kann man irgendeine Alternative ergreifen??

MFG
 
F

Funkys

Gast
Problem gelöst!!! Ich danke allen, die mir geholfen haben :) Ohne euch hätte ich es nicht hinbekommen


MFG
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ImageIcon über Socket schicken (Serialisierung) Netzwerkprogrammierung 6
G rmi -> imageIcon Netzwerkprogrammierung 3
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
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
G Bild über Socket schicken - Client/Server Netzwerkprogrammierung 10
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
N Datenaustausch zwischen Java-GUI und PHP-Programm über SOAP Netzwerkprogrammierung 19
L RMI Informationen über die Clients herausfinden Netzwerkprogrammierung 5
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
1 Kommunikation mit externem Programm über TCP Netzwerkprogrammierung 2
U Informationen über Netzwerkclients herausfinden Netzwerkprogrammierung 2
J Socket Erreichbarkeit eines Java Servers (Socket-Lösung) über das Internet Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben