# SWT Image versenden



## totix801 (12. Okt 2008)

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 

```
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:



```
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 (13. Okt 2008)

Mach es in etwa so:

```
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:

```
out.write(test.getImageData().data);
out.flush();
out.close();
```


----------



## tuxedo (13. Okt 2008)

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


----------

