SWT Image versenden

Status
Nicht offen für weitere Antworten.
T

totix801

Gast
Hi,

ich möchte en SWT Image über das Netzwerk verschicken. Als byte[] verpackt hab ich mir das Ganze eigendlich ganz einfach vorgestellt, aber ich habe dabei einpaar Probleme. Auf der Empfängerseite kommen komischwerweise immer nur teile der Datei an.
Hier ist der Code der beiden Teile:

Sender
Code:
package webcam;

import java.io.BufferedOutputStream;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.graphics.Transform;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.jalimo.gstreamer.grab.FrameListener;
import org.jalimo.gstreamer.grab.Grabber;

public class Main {
	
	
	public static Image constructImage(byte[] frameData, int width, int height, int bpp) {
		PaletteData palette = new PaletteData(0xff0000, 0x00ff00, 0x0000ff); 
		ImageData data = new ImageData(width, height, bpp, palette, width*3, frameData);
		return new Image(Display.getDefault(), data);
	}

	public static void main(String[] args) throws UnknownHostException, IOException {	
	
		final Display display = Display.getDefault();
		final Shell shell = new Shell(display);
		final Label l = new Label(shell, SWT.BORDER);
		l.setBounds(100,100,200,200);

		
	
		String myHost = "192.168.1.5";
		int myPort = 3333;
		Socket s = new Socket(myHost, myPort);
		final BufferedOutputStream out = new BufferedOutputStream(s.getOutputStream());
		
		ImageData imageData = new ImageData("test.png");
		Image test = new Image(display,imageData);
		System.out.println(test.getImageData().data.length);
		l.setImage(constructImage(test.getImageData().data, 200, 200, 24));
		out.write(test.getImageData().data);
		out.flush();
		
		
		


		
		System.out.println("open now");	
		shell.open();		
		
		while (!shell.isDisposed())
			display.readAndDispatch();
		display.dispose();
		out.close();
		
	}
	
}


Und hier der Empfänger:


Code:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketException;

import org.eclipse.swt.*;
import org.eclipse.swt.graphics.*;
import org.eclipse.swt.widgets.*;

public class Main {

	public static void main(String[] args) throws IOException {
		
		Display display = new Display();
		Shell shell = new Shell(display);
		Image image = null;
		int myPort = 3333;
	
		ServerSocket myServer = new ServerSocket(myPort);
		int readMe;
		System.out.println("Warte auf eingehende Verbindung auf Port " + myPort + " ....");
		//System.out.println("Warte auf eingehende Verbindung ....");
		Socket mySocket = myServer.accept();
		System.out.println("Eingehende Verbindung aufgebaut. Bereit zum Empfang.");
		BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream());
		
		byte[] tmp = new byte[120000];

		System.out.println(in.read(tmp));
      
		Label label = new Label(shell, SWT.BORDER);
		label.setBounds(1,1,300,300);
		label.setImage(constructImage(tmp, 200,200,24));

		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) display.sleep();
		}
		if (image != null) image.dispose();
			display.dispose(); 
	}

	public static Image constructImage(byte[] frameData, int width, int height, int bpp) {
		PaletteData palette = new PaletteData(0xff0000, 0x00ff00, 0x0000ff); 
		ImageData data = new ImageData(width, height, bpp, palette, width*3, frameData);
		return new Image(Display.getDefault(), data);
	}
}

Der Aufruf von System.out.println(in.read(tmp)); gibt aber komischerweise immer nur 1448 aus. Ist da vielleicht in ganz simpler Fehler, oder etwas das ich vergessen habe?
Hoffe jemand kannn helfen.

Torsten
 

gex

Bekanntes Mitglied
Mach es in etwa so:
Code:
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.graphics.ImageData;
import org.eclipse.swt.graphics.PaletteData;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class Main {

   public static void main(String[] args) throws IOException {
      
      Display display = new Display();
      Shell shell = new Shell(display);
      Image image = null;
      int myPort = 3333;
   
      ServerSocket myServer = new ServerSocket(myPort);
      System.out.println("Warte auf eingehende Verbindung auf Port " + myPort + " ....");
      Socket mySocket = myServer.accept();
      System.out.println("Eingehende Verbindung aufgebaut. Bereit zum Empfang.");
      BufferedInputStream in = new BufferedInputStream(mySocket.getInputStream());
      
      ByteArrayOutputStream bos = new ByteArrayOutputStream();
      byte[] buf = new byte[1024];
      int len;
      while ((len = in.read(buf)) > 0) {
          bos.write(buf, 0, len);
      }
      byte[] data = bos.toByteArray();

      Label label = new Label(shell, SWT.BORDER);
      label.setBounds(1,1,300,300);
      label.setImage(constructImage(data, 200,200,24));

      shell.open();
      while (!shell.isDisposed()) {
         if (!display.readAndDispatch()) display.sleep();
      }
      if (image != null) image.dispose();
         display.dispose();
   }

   public static Image constructImage(byte[] frameData, int width, int height, int bpp) {
      PaletteData palette = new PaletteData(0xff0000, 0x00ff00, 0x0000ff);
      ImageData data = new ImageData(width, height, bpp, palette, width*3, frameData);
      return new Image(Display.getDefault(), data);
   }
}

und schliess den OutputStream nach dem flush, dann weiss der Server auch wann Schluss ist:
Code:
out.write(test.getImageData().data);
out.flush();
out.close();
 
T

tuxedo

Gast
write() liefert dir als Ergebnis die Anzahl an gesendeten bytes. D.h. du müsst prüfen, ob auch wirklich alles gesendet wurde. Wenn nicht, musst du den Rest nochmals in write() reinstecken. Eben solange bis wirklich alles durch die Leitung durch ist.

Wenn du's unbedingt in einem Aufruf gesendet haben willst, schau dir die writeFully Methoden in DataOutputStream an. Im Endeffekt macht die aber auch nix anderes das eben von mir beschriebene.

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
M PdfPCell, Image und Chunk Netzwerkprogrammierung 4
S Server-Client: Image senden Netzwerkprogrammierung 2
M Google Image Upload Netzwerkprogrammierung 12
T Image aus Applet an PHP Seite senden? Netzwerkprogrammierung 3
U Image erzeugen aus empfangenen Daten Netzwerkprogrammierung 7
N java.awt.image.BufferedImage über Socket schicken Netzwerkprogrammierung 3
H Socket Kann ein Socket server 2 dimensionale Arrays empfangen und versenden? Netzwerkprogrammierung 3
T E-Mail versenden. Netzwerkprogrammierung 8
L Versenden von "Bildschirm" Netzwerkprogrammierung 2
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
L Email versenden mit Java funktioniert nicht, Fehlermeldungen: MessagingException & SocketException Netzwerkprogrammierung 10
precoc String Array versenden Netzwerkprogrammierung 7
B Viele verschiedene E-Mails an unterschiedliche Empfänger schnell versenden? Netzwerkprogrammierung 8
S Email via Googlemail versenden Netzwerkprogrammierung 17
M Mail über Exchange versenden Netzwerkprogrammierung 13
P Dateiennamen versenden Netzwerkprogrammierung 4
P Mit Java Javascript-Anfrage versenden Netzwerkprogrammierung 4
T Objekte im NIO unblocking mode versenden Netzwerkprogrammierung 11
N String als byte Array über Socket versenden Netzwerkprogrammierung 8
N Socket File über Socket vom Server an Client versenden Netzwerkprogrammierung 15
M Socket Datei über Socket versenden Netzwerkprogrammierung 5
C An WebDAV einen "MKCOL" Befehl versenden Netzwerkprogrammierung 4
X Versenden von Objekten braucht zu lange Netzwerkprogrammierung 5
N Technologie zum versenden von Objects Netzwerkprogrammierung 5
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
R Versenden einer MIME-Datei per E-Mail [solved] Netzwerkprogrammierung 5
N E-mail versenden Netzwerkprogrammierung 4
B Wie HTTP GET/POST Anfrage versenden? Netzwerkprogrammierung 7
T Einzelne Bits per Socket versenden Netzwerkprogrammierung 16
F Link erzeugen und versenden Netzwerkprogrammierung 4
O Wert versenden? Netzwerkprogrammierung 12
G Datein versenden funktioniert nicht ! Netzwerkprogrammierung 19
S Objekt Felder versenden Netzwerkprogrammierung 5
A Konflikt: Blocking und Non-Blocking bei Objekte versenden Netzwerkprogrammierung 4
O Über Socket Array versenden Netzwerkprogrammierung 5
G Bytes versenden Netzwerkprogrammierung 9
G Datei über ObjectInputStream versenden Netzwerkprogrammierung 8
B Strings versenden | Nur 1 Client Netzwerkprogrammierung 6
P Objekte über DatagramSocket versenden Netzwerkprogrammierung 12
V Kann keine DatagramPackets versenden von einem Jar Archiv Netzwerkprogrammierung 4
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
S Dateien versenden Netzwerkprogrammierung 16
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
F IP "versenden" Netzwerkprogrammierung 6
N *.* Dateien versenden im Lan Netzwerkprogrammierung 5
H Versenden von Objekt Netzwerkprogrammierung 2
L JavaMail: Versenden von mails funktioniert nicht Netzwerkprogrammierung 7
P Array per Socketverbindung versenden Netzwerkprogrammierung 2
O Sms versenden Netzwerkprogrammierung 5
T Dateien wia P2P Connection versenden Netzwerkprogrammierung 2
S E-Mails versenden. Netzwerkprogrammierung 10
D Bits über UDP versenden Netzwerkprogrammierung 3
M generelle Frage zum Versenden Netzwerkprogrammierung 4
T Mit JavaMail API Faxe versenden? Netzwerkprogrammierung 5
K Files versenden Netzwerkprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben