Remote DownloadManager



  • Hi....

    Ich hab mal wieder ein kleines Problem...diesmal in Java.....

    Und zwar moechte ich mir einen fernbedienbaren Download Manager programmieren so das wenn ich z.B. im Urlaub in nem Inet Cafe im Netz nen intressantes File entdecke dies mir nach Hause downloaden kann....

    Dachte mir ich mach ds ganze ueber Servlets die zuhause auf meinem Webserver (ReSin) laufen... nun ist es ja im Prinzip kein problem von Servlet ne WebSeite generieren zu lassen in der ich in nem TextFeld die Url des Files eingebe welches ich saugen moechte und dies dann vom Servlet saugen zu lassen...
    Mein Problem ist nur wie mach ichs das der Downloadvorgang nicht unterbrochen wird wenn ich die Webseite (also das Servlet) verlasse oder meinen Browser schliesse... ich will ja schliesslich nicht solange im Cafe sitzen (und zahlen) bis der Rechner zuhause fertig ist....

    Theoretisch ist mir ja klar wie mans machen muss... fuer den Download nen eigenen Prozess abspalten und diesen dann die arbeit machen lassen...bloss 1. Wie macht man das unter Java....2. wie krieg ichs dann hin das wenn ich spaeter nochmal auf mein Servlet gehe er nicht noch so einen Prozess startet sondern sich wieder mit dem altem verbindet um evtl. weitere Files zur DownloadListe hinzuzufuegen oder einfach Statusabfragen zu machen....

    Hatte auchschon ueberlegt ein vom Server unabhaengiges Programm zu schreiben welches immer laufen muss und in regelmaessigen abstaenden ne bestimmte Textdatei einliest in der Das Servlet die Urls der zu ladenenden Files hinterlegt.. aber diese loesung gefaellt mir nicht weil dieses Programm dann sinnvollerweise in C++ geschrieben sein sollte und nicht in Java... ausserdem haett ich es gerne alles ueber Servlets.... also wenn jemand von euch da nen Loesungsansatz haette waere das mehr als genial.... 🙂

    THANX im vorraus....

    Bye Lord Helmchen



  • Also zu 1.)
    Das machst du über einen eigenen Thread:

    [...]
    //Hier kommt deine Download-Anforderung
    DownloadThread th = new DownloadThread(fileToDownload);
    th.start();
    //Hier kann das Servlet weitermachen. Es wird _nicht_ auf das Ende des Downloads gewartet
    
    [...]
    
    class DownloadThread
    extends Thread {
    
      private String file;
    
      public DownloadThread(String file)
      {
        this.file = file;
      }
    
      public void run()
      {
        //Hier machst du den Download
      }
    }
    

    zu 2.) Das ist total unnötig. Ein Thread brauch sogut wie keinen Speicher und mann kann ruhig mehrere hundert davon gleichzeitig laufen lassen.

    HTH



  • Hi destructOr

    18:29:58 25.07.2003 Titel: Zitieren

    --------------------------------------------------------------------------------
    Also zu 1.)
    Das machst du über einen eigenen Thread:
    Java Code:
    [...]
    //Hier kommt deine Download-Anforderung
    DownloadThread th = new DownloadThread(fileToDownload);
    th.start();
    //Hier kann das Servlet weitermachen. Es wird _nicht_ auf das Ende des Downloads gewartet

    [...]

    class DownloadThread
    extends Thread {

    private String file;

    public DownloadThread(String file)
    {
    this.file = file;
    }

    public void run()
    {
    //Hier machst du den Download
    }
    }

    Mhh... aber wird der Thread nicht beim beenden des Servlets (also beim wechseln der WebSeite oder schliessen des Browsers) ebenfalls beendet ?? Threads laufen doch meines Wissens nach im selben Adressraum wie der Aufrufende Prozess....deswegen meinte ich ja man mueste nen eigenen Prozesses starten..

    zu 2. mhhh.. ich hatte geplant die downzuloadenen Urls innem Vector zu speichern und diesen nacheienander abzuarbeiten so das nicht mehr als z.B. 3 Files gleichzeitig geladen werden wegen der Bandbreite... aber das waere erstmal egal.. wichtiger ist die sache oben mit der Nebenlaeufigkeit...

    Danke fuer den Tip.. werd dann dochmal mit nem Thread versuchen....

    Bye LordHelmchen



  • Mhh... aber wird der Thread nicht beim beenden des Servlets (also beim wechseln der WebSeite oder schliessen des Browsers) ebenfalls beendet ??

    Das sollte nicht passieren. Das Servlet selbst wird ja auch nicht in einem eigenen Prozess gestartet, sondern ebenfalls in einem Thread ausgeführt.

    zu 2. mhhh.. ich hatte geplant die downzuloadenen Urls innem Vector zu speichern und diesen nacheienander abzuarbeiten so das nicht mehr als z.B. 3 Files gleichzeitig geladen werden wegen der Bandbreite

    Das sollte ja eigentlich egal sein, weil es keine Rolle spielt, ob denn nun 3 Fiels gleichzeitig oder nacheinander geladen werden. (u.U ist es sogar besser, wenn sie gleichzeitig geladen werden, weil ein Server es u.U nicht so schnell liefern kann, wie du runterladen könntest - dann wäre in der Zwischenzeit die Leitung nicht ausgenutzt)

    Wenn du es dennoch so haben willst, dann ist das natürlich auch kein Problem. Mach einfach einen zentralen Thread, der einen Queue hat und diese dann abarbeitet:

    [...]
    //In deinem Servlet hälst du eine statische Variable
      private static QueueThread queue = new QueueThread();
    
    [...]
    //Hier kommt die Download-Anforderung
    queue.add(myFileToDownload);
    //Hier kann das Servlet ganz normal weitermachen.
    [...]
    
    class DownloadQueue
    implements Runnable {
      private static java.util.LinkedList queue = new java.util.LinkedList();  
    
      public static void add(String file)
      {
        queue.add(file);
        //Wenn der Thread noch nicht/nichtmehr läuft
        if (queue.size() == 1) {
          //Thread neu starten
          Thread th = new Thread((Runnable)DownloadQueue.class);
          th.start();
        }
      }
    
      public void run()
      {
        //Hier immer das erste File der Liste runterladen und dann rauslöschen,
        //solange bis keine Einträge mehr in der Liste sind.
      }
    }
    
    //alles ungetestet
    

    Diese Vorgehensweise bietet auch den Vorteil, dass du so z.B.: noch nicht laufene Downloads über das Web abbrechen könntest oder so.


Anmelden zum Antworten