Dateiübertragung

Status
Nicht offen für weitere Antworten.
L

LazyL

Gast
Ich bin dabei ein Programm zu schreiben mit dem ich ganze Ordner und deren Inhalte auf einen anderen Rechner kopieren kann. Mit einer einzelnen Datei hat das ganz gut geklappt, doch nun möchte ich alle Dateien und Unterordner übertragen. Doch nun klappt aufeinmal die Dateiübertragung nicht mehr, es wird zwar der Ordner und auch die Datei erstellt, doch die Datei ist komplett leer.

Hier mal der Code:

Sender:
Code:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Date;

public class Sender {

	String _adresse;
	int _port;
	DataOutputStream out;
	BufferedReader clientIn;
	PrintStream write;
	Socket socket;
	
	public Sender(String adresse, int port)
	{
		_port = port;
		_adresse = adresse;
	}
	
	
	public void verbinde()
	{
		try
		{
			
			System.out.println("requesting");
			socket = new Socket(_adresse, _port);
			System.out.println("request accepted");
			System.out.println("");
			System.out.println("establishing data-connection");
			Socket dcSocket = new Socket(_adresse, _port+1);
			System.out.println("data-connection established");
			
			clientIn = new BufferedReader(new InputStreamReader(dcSocket.getInputStream())); 
			out = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
			write = new PrintStream(dcSocket.getOutputStream());
		}
		catch (IOException e)
		{
			System.out.println("Fehler beim Verbindungsaufbau");
		}
		
		
		
	}
	
	public void beendeVerbindung()
	{
		try
		{
			socket.close();
		}
		catch (IOException e)
		{
			System.out.println("Fehler beim Beenden der Verbindung");
		}
	}
	
	public void sendDir(String path)
	{
		sendDir(new File(path));
		write.println("END");
	}
	
	public void sendDir(File dir) throws IllegalArgumentException
	{
		try
		{
			if (!dir.isDirectory())
			{
				sendFile(dir);
			}
			else
			{
				write.println("Start-Dir-"+dir.getName());
				System.out.println("Sende Ordner "+dir.getName());
				File[] inhalt =  dir.listFiles();
				int anzahl = inhalt.length;
				for (int i = 0; i < anzahl; i++)
				{
					System.out.println(inhalt[i]);
					if (inhalt[i].isDirectory())
					{
						sendDir(inhalt[i]);
					}
					else if(inhalt[i] != null)
					{
						sendFile(inhalt[i]);
					}
				}
				write.println("End-Dir-"+dir.getName());
				if (!clientIn.readLine().equals("ACK-"+dir.getName()))
				{
					System.out.println("Fehler bei der Übertragung von "+dir.getName());
				}
			}
		}	
		catch (IOException e)
		{
			System.out.println("Verbindungsfehler");	
		}
	}
	
	
	public void sendFile(File datei)
	{
		try
		{
			DataInputStream input = new DataInputStream (new BufferedInputStream(new FileInputStream(datei)));
			write.println("Start-File-"+datei.getName()+"-"+datei.length());
			System.out.println("Sende Datei "+datei.getName());
			byte[] puffer = new byte[0xffff];
			int i;
			long count =0;;
			Date date = new Date();
			long start = date.getTime();
			while ((i = input.read(puffer)) != -1)
			{
				write.println("ok");
				out.write(puffer, 0, i);
				out.flush();
				count += i;
				System.out.println(i+" bytes gesendet");
				puffer = new byte[0xffff];
				
			}
			//write.println("End-File-"+datei.getName());
			//out.flush();
			date = new Date();
			long complete = date.getTime();
			long time = complete - start;
			System.out.println("ENDE");
			String ack = clientIn.readLine();
			if (!(ack.equals("ACK-"+datei.getName())))
			{
				System.out.println("Fehler bei der Übertragung: "+ack+ " erwartet ACK-"+datei.getName() );
			}
			else
			{
				System.out.println("Datei "+datei.getName()+" gesendet");
				
				System.out.println("");
				System.out.println("Insgesamt wurden "+count/1000+" Kb in "+time/1000+" Sekunden gesendet.");
				if (time != 0l)
				{
					System.out.println("Übertragungsgeschwindigkeit: "+count/time+" Kb/s"); 
				}
			}
			input.close();
			
		}
		catch (FileNotFoundException e)
		{
			System.out.println("File not found!");
			
		}
		catch (IOException e)
		{
			System.out.println("Verbindungsfehler");
		}
		
		
		
	}
	
	
	
	
}


eine Steuerklasse für den Sender:
Code:
public class Steuerung {

	public static void main(String[] args)
	{
		Sender sender = new Sender("192.168.1.2", 3011);
		sender.verbinde();
		sender.sendDir(args[0]);
		sender.beendeVerbindung();
	}
	
}

Empfänger:
Code:
import java.util.Date;
import java.io.*;
import java.net.*;
import java.util.regex.*;


public class Empfaenger
{

	DataInputStream input;
	BufferedReader reader;
	PrintStream writer;
	String path = "";		
	

	public void empfange()
	{
		try
		{
			ServerSocket server = new ServerSocket(3011);
			System.out.println("waiting for request");	
			Socket socket = server.accept();
			System.out.println("request accepted");
			System.out.println("establishing data-connection");
			Socket dcSocket = new ServerSocket(3012).accept();
			System.out.println("data-connection established");

			input = new DataInputStream(new BufferedInputStream(socket.getInputStream()));
			reader = new BufferedReader(new InputStreamReader(dcSocket.getInputStream()));
			writer = new PrintStream(dcSocket.getOutputStream());			

			Pattern pattern = Pattern.compile("-");
			System.out.println("wait for command");
			String command = reader.readLine();
			System.out.println("command: "+command);
			while (!command.equals("END"))
			{
				String[] commands = pattern.split(command);
				for (int i = 0; i < commands.length; i++)
				{
				//	System.out.println(commands[i]);
				}
				if (commands[0].equals("Start") && commands[1].equals("Dir"))
				{
					empfangeDir(commands[2]);
					System.out.println("Ordner "+commands[2]+" erstellt");
				}
				else if (commands[0].equals("Start") && commands[1].equals("File"))
				{
					empfangeFile(commands[2], Long.parseLong(commands[3]));
					System.out.println(commands[2]+ " empfangen und gespeichert");
					writer.println("ACK-"+commands[2]);
				}
				else if (commands[0].equals("End") && commands[1].equals("Dir"))
				{
					if (!path.equals(""))
					{
						path = cutPath(path);
					} 
					writer.println("ACK-"+commands[2]);

				}	
				command = reader.readLine();
			}
		}
		catch (IOException e)
		{
			System.out.println("Verbindungsfehler");
		}
	
	}
	
	public void empfangeDir(String name)
	{
		File dir;
		if (!path.equals(""))
		{
			dir = new File(path+"/"+name);
		}
		else
		{
			dir = new File(name);
		}
		dir.mkdir();
		if(!path.equals(""))
		{
			path = path+"/"+name;
		}
		else
		{
			path = name;
		}
	
	}
		

	public void empfangeFile(String name, long groesse)
	{
		boolean beenden = false;
		try
		{
	
		while (!beenden)
		{
 			
			DataOutputStream out = new DataOutputStream( 
							new BufferedOutputStream(
								new FileOutputStream(path+"/"+name)));
			byte[] puffer = new byte[0xffff];
			int i;
			long count = 0l;
			Date date = new Date();
			long start = date.getTime();
			String s;

			while (count < groesse)
			{
				
				
				i = input.read(puffer);
				
				out.write(puffer, 0, i);
				out.flush();
				count += i;
				System.out.println("read and write "+i+" bytes");
				puffer = new byte[0xffff];
			} 
			out.close();
			date = new Date();
			long complete = date.getTime();
			long time = complete - start;
			 
			System.out.println("Datei "+name+" wurde übertragen");
			System.out.println("");
			System.out.println("Insgesamt "+count+" Bytes in "+time/1000+" Sekunden");
			System.out.println("Ãœbertragungsgeschwindigkeit: "+count/time+" Kb/s");
			
			
			
		}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}

	public static void main(String[] args)
	{
		Empfaenger empfang = new Empfaenger();
	
		empfang.empfange();
	}

	private String cutPath(String path)
	{
		if (path.equals(""))
		{
			throw new IllegalArgumentException("Path darf nicht leer sein");
		}
		Pattern pattern = Pattern.compile("/");
		String[] parts = pattern.split(path);
		if (parts.length == 1)
		{
			path = "";
		}
		else
		{
			String result = "";		
			for(int i = 0; i < parts.length - 2; i++)
			{
				result += parts[i]+"/";
			}
			result += parts[parts.length-2];
			path = result;
		}
		return path;
	}
	
}

Ich hab schon viel rumprobiert mit vielen Streams und anderen Sachen, aber es funktioniert einfach nicht.
Danke im voraus für Hilfe.
 

The_S

Top Contributor
Wenn du mir die relevanten Codezeilen zeigst, schau ich vielleicht ma drüber, aber ich hab momentan echt keine Zeit mich in fast 400 Zeilen Code einzuarbeiten. Kommt ne Fehlermeldung?
 

Leroy42

Top Contributor
Hobbit_Im_Blutrausch hat gesagt.:
Kommt ne Fehlermeldung?
Wahrscheinlich nicht.

Mein Vorschlag: Wenn du nicht debuggen kannst, bau ein paar System.out.println Befehle
dort ein, wo der Dateiinhalt erstellt werden soll.

Habe keinen Schimmer wo die Methode ist, aber das solltest du wohl schneller finden :wink:
 
G

Guest

Gast
Sorry, war wohl echt n bißchen viel aufeinmal. Die relevanten Methoden sind eigentlich sendFile() auf der Sender Seite und empfangeFile() auf der Empfänger Seite:

sendFile():
Code:
public void sendFile(File datei) 
   { 
      try 
      { 
         DataInputStream input = new DataInputStream (new BufferedInputStream(new FileInputStream(datei))); 
         write.println("Start-File-"+datei.getName()+"-"+datei.length()); 
         System.out.println("Sende Datei "+datei.getName()); 
         byte[] puffer = new byte[0xffff]; 
         int i; 
         long count =0;; 
         Date date = new Date(); 
         long start = date.getTime(); 
         while ((i = input.read(puffer)) != -1) 
         { 
            write.println("ok"); 
            out.write(puffer, 0, i); 
            out.flush(); 
            count += i; 
            System.out.println(i+" bytes gesendet"); 
            puffer = new byte[0xffff]; 
             
         } 
         //write.println("End-File-"+datei.getName()); 
         //out.flush(); 
         date = new Date(); 
         long complete = date.getTime(); 
         long time = complete - start; 
         System.out.println("ENDE"); 
         String ack = clientIn.readLine(); 
         if (!(ack.equals("ACK-"+datei.getName()))) 
         { 
            System.out.println("Fehler bei der Übertragung: "+ack+ " erwartet ACK-"+datei.getName() ); 
         } 
         else 
         { 
            System.out.println("Datei "+datei.getName()+" gesendet"); 
             
            System.out.println(""); 
            System.out.println("Insgesamt wurden "+count/1000+" Kb in "+time/1000+" Sekunden gesendet."); 
            if (time != 0l) 
            { 
               System.out.println("Übertragungsgeschwindigkeit: "+count/time+" Kb/s"); 
            } 
         } 
         input.close(); 
          
      } 
      catch (FileNotFoundException e) 
      { 
         System.out.println("File not found!"); 
          
      } 
      catch (IOException e) 
      { 
         System.out.println("Verbindungsfehler"); 
      } 
       
       
       
   }

empfangeFile():
Code:
public void empfangeFile(String name, long groesse) 
   { 
      boolean beenden = false; 
      try 
      { 
    
      while (!beenden) 
      { 
          
         DataOutputStream out = new DataOutputStream( 
                     new BufferedOutputStream( 
                        new FileOutputStream(path+"/"+name))); 
         byte[] puffer = new byte[0xffff]; 
         int i; 
         long count = 0l; 
         Date date = new Date(); 
         long start = date.getTime(); 
         String s; 

         while (count < groesse) 
         { 
             
             
            i = input.read(puffer); 
             
            out.write(puffer, 0, i); 
            out.flush(); 
            count += i; 
            System.out.println("read and write "+i+" bytes"); 
            puffer = new byte[0xffff]; 
         } 
         out.close(); 
         date = new Date(); 
         long complete = date.getTime(); 
         long time = complete - start; 
          
         System.out.println("Datei "+name+" wurde übertragen"); 
         System.out.println(""); 
         System.out.println("Insgesamt "+count+" Bytes in "+time/1000+" Sekunden"); 
         System.out.println("Ãœbertragungsgeschwindigkeit: "+count/time+" Kb/s"); 
          
          
          
      } 
      } 
      catch (Exception e) 
      { 
         e.printStackTrace(); 
      } 
   }
wie man sieht, geb ich auch aus, wenn die Datei geschrieben wird. Er gibt auch an, dass er so und so viel bytes empfangen und geschrieben hat, die Datei ist jedoch leer.[/quote]
 
V

vorschlag

Gast
Leider habe ich keine Idee, wo der Fehler liegt. Du könntest vieleicht noch zum debuggen in die Konsole dir den Puffer ausgeben lassen, um zu sehen, was er genau empfängt. (und ob da das Richtige ankommt)

Ach ja, das puffer = new byte[0xffff]; in den Schleifen ist unnötig, verbraucht aber Rechenzeit.
 
L

LazyL

Gast
Danke, hab ich probiert, und im puffer stehen die daten drinne. Der Fehler muss also beim write des Empfängers geschehen.
Mach ich da irgendwas falsch? benutze ich die falschen Streams?
Mit den Streams hab ich schon n bißchen rumexperimentiert, hat aber nichts gebracht.
 
A

ASICS

Gast
Hallo,

suche das gleiche Programm, wie du gerade gebastelt hast.
Hast du den Fehler schon behoben?

Gruß

ASICS
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben