# Netzwerk Dateiübertragung



## benni84 (21. Dezember 2007)

Hallo zusammen,

ich habe folgendes Problem. Ich habe ein Programm zum übertragen von Dateien geschrieben. 

Der Client sendet die Datei über folgende Methode:


```
public boolean sendeDatei (File file) throws FileNotFoundException{
		boolean erfolgreich = false;
		Socket soc = null;

		System.out.println("Dateiinformationen gesendet");
		try {
			soc = new Socket(getHostName(),getPortNr());
			DataOutputStream datOutputStream = new DataOutputStream(soc.getOutputStream());

			FileInputStream fileInputStream = new FileInputStream(file);
			
			

			int i;

			while((i = fileInputStream.read()) != -1){
				datOutputStream.write(i);
			}


			datOutputStream.flush();
			datOutputStream.close();
			fileInputStream.close();

			soc.close();

			System.out.println("absenden erfolgreich, Server closed");
		} catch (Exception e) {
			System.out.println("Fehler beim absenden");
			try {
				soc.close();
			} catch (IOException e1) {
				// TODO Automatisch erstellter Catch-Block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}


		return erfolgreich;
	}
```

Der Server empfängt die Datei über folgende Methode

```
public File empfangeDatei(){
		DateiInformationen dateiInformationen;
		File file = null;
		
		DataInputStream datInputStream = null;
		Socket soc = null;

		try {
			soc = getServerSocket().accept();
			datInputStream = new DataInputStream(soc.getInputStream());

			file = new File("test.txt");

			System.out.println("Eingehende Datei: " + file.getName());
			FileOutputStream fileOutputStream = new FileOutputStream(file);
			
			

			int i = 0;
			
			while((i = datInputStream.read()) != -1){
				fileOutputStream.write(i);
				fileOutputStream.flush();
			}

			soc.close();
			fileOutputStream.close();
			datInputStream.close();

			System.out.println("Speicherort: " + file.getAbsolutePath());

			System.out.println("empfangen erfolgreich");
		} catch (IOException e) {
			try {
				soc.close();
			} catch (IOException e1) {
				// TODO Automatisch erstellter Catch-Block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}



		return file;
	}
```

Mit Textdateien klappt das Senden einwandfrei. Ich möchte das senden aber Folgendermaßen gestalten. Das senden Soll unabhängig von Dateityp funtionieren. Leider muss man vor dem FileOutputStream bereits eine File(String Dateiname) angelegt haben. Um die File anzulegen müsste ich also vorher schon die Dateiendung wissen.

Gibt es keine möglichkeit vor der Datei ein paar Informationen über die Datei zu senden (Dateiname, Dateigröße)?

Vielen Dank im Voraus

Benni


----------



## Thomas Darimont (22. Dezember 2007)

Hallo,

schau mal hier:
http://www.tutorials.de/forum/java/245134-datei-mittels-tcp-uebertragen.html

Gruß Tom


----------



## benni84 (22. Dezember 2007)

Hallo Thomas,

danke für die schnelle Antwort, aber bei dieser Lösung besteht immer noch das gleiche Problem wie bei meiner Variante


```
public static void main(String[] args) {

		File file = new File("c:/bigfile-1.0.0.tgz");
		FileProvider fileProvider = new FileProvider(file, 4711);
		FileFetcher fileFetcher = new FileFetcher("localhost", 4711, file.getName());
		ExecutorService executorService = Executors.newFixedThreadPool(2);
		executorService.execute(fileProvider);
		executorService.execute(fileFetcher);
		executorService.shutdown();

}
```

In diesem Beispiel das du mir gepostet hast wird dem FileFetcher und dem Fileprovider die file übergeben. Dies kann doch nur lokal in dieser Testanwendung funktionieren. Wenn sich der Empfänger tatsächlich auf einem anderen host befindet kann man die file nicht im Konstruktor übergeben.

Benni


----------



## dto (27. Dezember 2007)

http://dontsch.do.funpic.de/ unter tools findest du den source code für ein package connection.rar damit kannst du Dateien schicken. Die Nutzung ist recht einfach, falls du ein Beispiel brauchst kannst du nochmal schreiben.


----------

