# Download Client



## Emox (10. Jul 2007)

Hallo,


ich würde gerne einen kleines applet, dass funktionen wie z.B. Anti-leech(anti-leech.com) hat. Also ein Downloadmanager der die echte HTML-Addresse vor dem Downloader versteckt.

Ich bin erst seit kurzem an Java dran, weiß also nicht soviel darüber, nun hab ich ein Problem, google hat mir leider nicht helfen können, wusste auch nicht so recht was ich eingeben sollte:

Wie bekomme ich die Downloadgeschwindigkeit heraus? Also ich möchte, dass der Nutzer sieht wie schnell er File XYZ herunterläd.


----------



## wayne0101 (30. Jul 2007)

kriegst bissi was von meinem code. mein applet benutzt diese methode zum downloaden von dateien von einem entfernten webserver:


```
private void transferFile(String location, String filename, String destination){
        OutputStream out = null;
        InputStream  in = null;
        
        String fileInputPath  = location   +filename;
        String fileOutputPath = destination+filename;
        
        File target = new File(fileOutputPath);
        if( target.exists() )
            if( !target.delete() ){
                System.err.println("Die Datei "+fileOutputPath+" konnte nicht ueberschrieben werden!");
                return;
            }
        
        try {
            URL url = new URL(fileInputPath);
            
            in = url.openStream();
            
            out = new BufferedOutputStream(new FileOutputStream(fileOutputPath));
            
            byte[] buffer = new byte[Configuration.TRANSFER_BYTES_SIZE];
            
            int numRead;
            while ((numRead = in.read(buffer)) != -1) 
                out.write(buffer, 0, numRead);
        } 
        catch (Exception e) {
            e.printStackTrace();
        } 
        finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
        }        
        System.out.println("FILE-TRANSFERE DONE");
    }
```

*zur erklärung:*

*location:* protokoll, domain und pfad, wo die datei zu finden ist. beispielsweise "http://www.download.org/files/"

*filename:* einfach nur der name der datei. der name der datei auf dem webserver ist in meinem fall der selbe wie der, in den ich die datei abspeichern will.

*destination:* lokaler pfad, an dem die datei gespeichert werden soll. beispielsweise "C:\My Downloads\"

die methode überprüft zunächst ob die datei nicht bereits vorhanden ist. ist dies der fall, versucht sie die vorhandene lokale datei zu löschen. schlägt dies fehl, meldet die methode dies.

ich hab kein problem dir diesen code zu geben, weil der nicht von mir stammt (zumindest der download-teil nicht). der zum download der datei nötige code dieser methode entstammt irgendeinem forum. hab damals mich ein wenig darüber in foren schlau gemacht, wie ich mein applet dazu bringe ne datei herunter zu laden. in allen von mir besuchten foren hab ich diesen code gefunden.

wenn du nun die download-geschwindigkeit herausfinden willst, musst du nur messen wie lange der durchlauf durch die while-schleife benötigt. anhand der größe des buffers (bei mir durch Configuration.TRANSFER_BYTES_SIZE festgelegt) kannst du so berechnen, wie lange es gedauert hat Configuration.TRANSFER_BYTES_SIZE zu schreiben und somit wieviele KB/s übertragen werden. die geschwindigkeit der festplatte beim schreiben kannst du an dieser stelle getrost vernachlässigen (es sei denn der nutzer befindet sich in einem terrabyte-netz ... aber bis sowas mal in die haushalte kommt vergeht warscheinlich noch mindestens ein halbes jahrzehnt).

wenn du eine prozentanzeige schreiben willst, wie weit der transfer ist, musst du vorher rausfinden, aus wievielen bytes deine datei überhaupt besteht. mit diesem problem hab ich mich aber bislang noch nicht auseinander gesetzt. bislang ist mir dazu auch noch keine methode über den weg gelaufen, ausser, auf dem webserver eine php-seite zu installieren, die die dateigröße ermittelt und zurückgibt, und diese aufzurufen, wenn ein transfer angefordert wird. möglich ist bestimmt auch zunächst von dem geöffneten InputStream "in" über die methode available() die größe der datei zu bekommen. nur ob das in jedem fall klappt/stimmt und ob man nach dem öffnen des streams warten muss bis die größe garantiert verfügbar ist und wie lange bzw. worauf, kann ich dir beim besten willen nicht sagen. dazu empfehl ich dir dann doch mal noch einige java-foren zu schmökern und ggf. nochmal was zu posten.

viel glück

wayne


----------



## wayne0101 (30. Jul 2007)

kriegst bissi was von meinem code. mein applet benutzt diese methode zum downloaden von dateien von einem entfernten webserver:


```
private void transferFile(String location, String filename, String destination){
        OutputStream out = null;
        InputStream  in = null;
        
        String fileInputPath  = location   +filename;
        String fileOutputPath = destination+filename;
        
        File target = new File(fileOutputPath);
        if( target.exists() )
            if( !target.delete() ){
                System.err.println("Die Datei "+fileOutputPath+" konnte nicht ueberschrieben werden!");
                return;
            }
        
        try {
            URL url = new URL(fileInputPath);
            
            in = url.openStream();
            
            out = new BufferedOutputStream(new FileOutputStream(fileOutputPath));
            
            byte[] buffer = new byte[Configuration.TRANSFER_BYTES_SIZE];
            
            int numRead;
            while ((numRead = in.read(buffer)) != -1) 
                out.write(buffer, 0, numRead);
        } 
        catch (Exception e) {
            e.printStackTrace();
        } 
        finally {
            try {
                if (in != null) {
                    in.close();
                }
                if (out != null) {
                    out.close();
                }
            } 
            catch (IOException e) {
                e.printStackTrace();
            }
        }        
        System.out.println("FILE-TRANSFERE DONE");
    }
```

*zur erklärung:*

*location:* protokoll, domain und pfad, wo die datei zu finden ist. beispielsweise "http://www.download.org/files/"

*filename:* einfach nur der name der datei. der name der datei auf dem webserver ist in meinem fall der selbe wie der, in den ich die datei abspeichern will.

*destination:* lokaler pfad, an dem die datei gespeichert werden soll. beispielsweise "C:\My Downloads\"

die methode überprüft zunächst ob die datei nicht bereits vorhanden ist. ist dies der fall, versucht sie die vorhandene lokale datei zu löschen. schlägt dies fehl, meldet die methode dies.

ich hab kein problem dir diesen code zu geben, weil der nicht von mir stammt (zumindest der download-teil nicht). der zum download der datei nötige code dieser methode entstammt irgendeinem forum. hab damals mich ein wenig darüber in foren schlau gemacht, wie ich mein applet dazu bringe ne datei herunter zu laden. in allen von mir besuchten foren hab ich diesen code gefunden.

wenn du nun die download-geschwindigkeit herausfinden willst, musst du nur messen wie lange der durchlauf durch die while-schleife benötigt. anhand der größe des buffers (bei mir durch Configuration.TRANSFER_BYTES_SIZE festgelegt) kannst du so berechnen, wie lange es gedauert hat Configuration.TRANSFER_BYTES_SIZE zu schreiben und somit wieviele KB/s übertragen werden. die geschwindigkeit der festplatte beim schreiben kannst du an dieser stelle getrost vernachlässigen (es sei denn der nutzer befindet sich in einem terrabyte-netz ... aber bis sowas mal in die haushalte kommt vergeht warscheinlich noch mindestens ein halbes jahrzehnt).

wenn du eine prozentanzeige schreiben willst, wie weit der transfer ist, musst du vorher rausfinden, aus wievielen bytes deine datei überhaupt besteht. mit diesem problem hab ich mich aber bislang noch nicht auseinander gesetzt. bislang ist mir dazu auch noch keine methode über den weg gelaufen, ausser, auf dem webserver eine php-seite zu installieren, die die dateigröße ermittelt und zurückgibt, und diese aufzurufen, wenn ein transfer angefordert wird. möglich ist bestimmt auch zunächst von dem geöffneten InputStream "in" über die methode available() die größe der datei zu bekommen. nur ob das in jedem fall klappt/stimmt und ob man nach dem öffnen des streams warten muss bis die größe garantiert verfügbar ist und wie lange bzw. worauf, kann ich dir beim besten willen nicht sagen. dazu empfehl ich dir dann doch mal noch einige java-foren zu schmökern und ggf. nochmal was zu posten.

viel glück

wayne


----------

