Objekt mit eine File-Attribut übers Netz verschicken

Chajnik

Grünschnabel
Hallo! Ich bitte euch um Hilfe. Ich möchte ein Objekt, das eine Datei als Attribut beinhaltet, über Socket verschicken. Momentan schicke ich separat die Datei und danach das Objekt selbst und bekomme folgende Fehlermeldung, nach dem die Datei verschickt wurde. Fehler: java.net.SocketException: Socket is closed


Objekt, das ich verscihcken möchte.
Code:
public class Datei {
	private String name;
	private String typ;
	private File file;

	public Datei(String name, String typ, String filename) {
		this.name = name;
		this.typ = typ;
		this.file = new File(filename);
       }
...........
	}

Code:
private boolean dateiSenden(Socket socket, File file) throws IOException {
		OutputStream os = socket.getOutputStream();
		BufferedOutputStream bos = new BufferedOutputStream(os);

		FileInputStream fis = new FileInputStream(file);
		BufferedInputStream bis = new BufferedInputStream(fis);

		int read = 0;
		long total = 0;
		byte[] data = new byte[8 * 1024]; // 8kB
		while (read != -1) {
			read = bis.read(data); 
			if (read > 0)
				bos.write(data, 0, read);
			total += read;
			if (total % (10 * 1024 * 1024) == 0)
		}

		bos.flush();
		bis.close();
		bos.close();
		return true;
	}

	private boolean objektSenden(Socket socket, Object obj) throws IOException,
			ClassNotFoundException {
		ObjectOutputStream oos = new ObjectOutputStream(socket
				.getOutputStream());
		ObjectInputStream is = new ObjectInputStream(socket.getInputStream());
		System.out.println("Server kontaktiert: " + socket.getInetAddress());

		oos.writeObject(obj); 
		System.out.println("\n MyObjekt-Objekt verschickt...");

		return true;
	}

Code:
....
Datei mp3 = new Datei("01", "mp3", "01.mp3");

	Socket sendSocket = null;
	try {
	sendSocket = new Socket("localhost", 9999);
	} catch (IOException e) {
	       System.out.println("Exception in der Verbinden-Methode");
        }
	dateiSenden(sendSocket, mp3.getFile());
	System.out.println("Zeile zwischen \"Datei senden\" und \"Objekt sendne\""					
	objektSenden(sendSocket, mp3 );
....
 
Dein Objekt muss noch das Interface Serializeable implementieren, sonst kann es nicht verschickt werden.

Du müsstest bei deinen Sende-Methoden die close-Anweisungen der Streams wegmachen. Viele Streams schließen ihre Parameter-Streams gleich mit. Im Endeffekt wird also der Stream vom Socket geschlossen und geschlossene Streams können nicht wieder aufgemacht werden.

EDIT:
Achso, deine Idee mit der Datei ist ja nicht schlecht, aber wird nicht funktionieren. Ich bin selbst damit mal auf die Schnauze gefallen und haben mehrere Tage daran gesessen den Fehler zu finden bis ich merkte, dass das File-Objekt ja überhaupt keinen Inhalt besitzt. Ein File-Objekt beinhaltet nur formale Daten wie Pfad, Name, Größe, etc., aber nicht den eigentlichen Dateiinhalt. Wenn du die Datei verschicken willst, müsstest du diese einlesen und dann verschicken. Du könntest z.B. die Klasse File ableiten und in der abgeleiteten Klasse dann die Datei einlesen lassen. Ein Objekt von dieser neuen Klassen könntest du dann verschicken bzw. als Parameter an ein Datei-Objekt übergeben.

EDIT2:
Und das ist irgendwie das falsche Unterforum. Wär nicht schlecht, wenn das jemand verschieben könnte ;)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück