Bild über Socket senden.

Kai008

Erfahrenes Mitglied
Wollte mal versuchen ein Bild von nen Server zu nen Client zu schicken, und auf ein JLabel zu pflastern.
Funktioniert aber irgendwie nicht, bekomme nur Mist auf der Client-Seite raus.
Kann mir wer bitte schnell sagen, was ich falsch gemacht habe?

Java:
package core;

import java.io.File;
import java.net.ServerSocket;
import java.net.Socket;

import javax.imageio.ImageIO;

public class Main
{
	public Main() throws Exception
	{
		ServerSocket serverSocket = new ServerSocket(100);
		Socket socket = serverSocket.accept();
		ImageIO.write(ImageIO.read(new File("image.jpg")), "jpeg", socket.getOutputStream());
	}
	public static void main(String[] args) throws Exception
	{
		new Main();
	}
}

Java:
package core;

import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.net.Socket;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.List;

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

public class Main
{
	public Main() throws Exception
	{
		Socket socket = new Socket("127.0.0.1", 100);
		
		List<Byte> byteList = new ArrayList<Byte>();
		int data = 0;
		while((data = socket.getInputStream().read()) > 0)
			byteList.add((byte)data);
		
		JFrame frame = new JFrame("lol");
		frame.setSize(200, 200);
		
		byte[] byteArray = new byte[byteList.size()];
		for(int i = 0; i < byteList.size(); i++)
		{
			byteArray[i] = (byte)(byteList.get(i) & 0xff);
			System.out.println(byteArray[i]); //Output the received Data's
		}
		
		BufferedImage image = ImageIO.read(new ByteArrayInputStream(byteArray));
		
		JLabel label = new JLabel(new ImageIcon(image));
		label.setBounds(100, 100, 200, 200);
		frame.add(label);
		
		frame.setVisible(true);
	}	
	public static void main(String[] args) throws Exception
	{
		try
		{
			new Main();
		}
		catch (SocketException e)
		{
			//TODO: Empty, to watch only Exceptions of Server.
		}
	}
}
 
Danke. Hab vorhin gegooglet, diesen Thread habe ich aber nicht enddeckt.
Hab jetzt versucht, beim Client auf JPEGCodec ect. umzusteigen, hat so auf Anhieb hingehaut. Eclipse meldet aber:

Eclipse hat gesagt.:
Access restriction: The method createJPEGDecoder(InputStream) from the type JPEGCodec is not accessible due to restriction on required library C:\Programme\Java\jre6\lib\rt.jar

Hab nur Anleitungen gefunden, wie man die Fehlermeldung ausblendet, aber was sie bedeutet nicht.
 
Hallo,

normalerweise sollte man keine JRE internen Klassen (sun.*, com.ibm, etc..) verwenden, da diese nicht Teil des public APIs sind und somit nicht vom JRE Hersteller gewartet werden. In zukünftigen JRE Versionen könnten die Klassen nicht mehr enthalten sein oder sich anders verhalten...

Aber zum großen Teil sind diese sun Klassen quasi Standard und bei vielen JRE Herstellern enthalten und da viele Benutzer unartig waren und auf solche interne Funktionalität (man denke da nur an sun.misc.Unsafe ...) verlassen haben wird man diese oft verwendeten Klassen auch kaum aus dem JRE entfernen...

Weiterhin ist der JpegEncoder / Decoder um einiges schneller als ImageIO... AFAIK und IMHO

Gruß Tom
 

Neue Beiträge

Zurück