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:
eine Steuerklasse für den Sender:
Empfänger:
Ich hab schon viel rumprobiert mit vielen Streams und anderen Sachen, aber es funktioniert einfach nicht.
Danke im voraus für Hilfe.
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.