Netzwerk Dateiübertragung

benni84

Grünschnabel
Hallo zusammen,

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

Der Client sendet die Datei über folgende Methode:

Code:
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
Code:
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
 
Hallo Thomas,

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

Code:
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
 
Zurück