# dateien kopieren, am localhost funktionierts, im netz nicht



## daneelolivaw (5. Mai 2007)

Hallo!

Ich habe folgendes Problem: Hab mir eine Anwendung (Client/Server) geschrieben die es mir möglich macht von einem Rechner auf den anderen zuzugreifen, dort im Dateisystem zu browsen und natürlich auch Dateien runterzuladen. Das ganze funktioniert auch super wenn ichs auf meinem Rechner teste...also hald Server bei mir und ich connecte mit dem Client der auch bei mir läuft zu meiner IP. Ich kann browsen und Dateien runterladen.

Habe das ganze jetzt aber natürlich auch im LAN gestestet und da habe ich jetzt folgendes Problem:
Ich starte am Rechner meines Bruders (WinXP) den Server und verbinde mich von meinem Rechner (Kubuntu 7.04) aus zum Server bei meinem Bruder. Zuerst funktioniert das ganze super. Ich kann im Dateisystem herumbrowsen was ich will jedoch wenn ich eine Datei downloaden will passiert folgendes. Der Server beginnt Daten zu schaufeln und der Client liest auch brav Daten aus seinem Stream. Dann ist der Server fertig (hat alle Bytes in den Stream geschrieben) und der Client wartet noch immer auf die letzten paar Bytes.

Keine Ahnung wieso...

Der Code sieht folgendermaßen aus:

Server:

```
System.out.println("Download request für "+dir.getAbsoluteFile()+fsdelim+ubef);
File dl=new File(dir.getAbsoluteFile()+fsdelim+ubef);
FileInputStream fis=new FileInputStream(dl);
                                                                                        
byte b[]=new byte[1024*1024];
int n;
                        
ps.println(dir.getAbsoluteFile()+fsdelim+ubef);
                        
try{
  long sum=0;
  while(sum<dl.length() && (n=fis.read(b))!=-1) {
    os.write(b,0,n);                                
    os.flush();
    sum+=n;
    System.out.println(sum+" Bytes gesendet!");                                
  }
  System.out.println(sum+" von "+dl.length()+" Bytes gesendet!");
} catch(IOException e){
  System.out.println("-- IOException beim Kopieren --");
}
os.flush();
System.out.println("Download beendet!");
```

Client:

```
System.out.println(inServ.readLine()+" nach "+target);
                                
                                byte b[]=new byte[1024*1024];
                                int n;
                                
                                try{
                                    int i=0;
                                    long sum=0;
                                    long soll=(((Satz)saetze[datei-1]).getSize());  //Dateigröße die mir Server angibt
                                    while(sum<soll&&(n=is.read(b))!=-1) {
                                        i++;
                                        fos.write(b,0,n);
                                        sum+=n;
                                        if(i%1000==0) {
                                            double proz=((double)sum)/((double)soll);                                            
                                            System.out.println(i+"KB downloaded..."+Math.round(proz*100)+"%");                                            
                                        }
                                        System.out.println(sum+"/"+soll);
                                    }                                    
                                    fos.close();
                                    System.out.println(sum+" bytes downloaded...100%");
                                } catch(IOException e){
                                    System.out.println("-- IOException beim Kopieren --");
                                    e.printStackTrace();
                                }
                                
                                System.out.print("Download beendet!\n> ");
```

Die Angabe im if(i%1000... stimmt nimmer weil ich die Bytefeldgröße mitlerweile geändert hab. Habs vorher mit 1024 gehabt und jetzt eben mit 1024 * 1024 probiert.

Der Server gibt  System.out.println(sum+" von "+dl.length()+" Bytes gesendet!"); das richtig aus also muss er alles in den Stream schreiben aber anscheinend kommt nicht alles beim Client an?!? Gibts das dass ich da Bytes verliere? Aber TCP dürfte das doch nicht zulassen oder?

Also bitte seid so gut und helft mir,

lg ga


----------



## ich_wills_wissen (11. Mai 2007)

Wenn Du nicht sicher bist ob der Server alles sendet schreib doch alles parallel auf die Konsole.. nur so als Idee..


----------



## daneelolivaw (16. Mai 2007)

Danke für die Antwort.

Ich bin ja sicher, dass der Server alles sendet! Am Localhost funktionierts ja auch.

Wo kann da der Hund begraben sein?

PS: Hab mich solange nicht gemeldet, weil ich für eine Prüfung lernen musste und für mein privates Programmiervergnügen keine Zeit hatte.


----------

