# Launcher für mein Spiel



## Messoras (9. Feb 2015)

Hallo,
Ich bin's mal wieder und ich sitze nach wie vor noch an meinem Spiel 
Da es für die Spieler relativ nervig ist, das Spiel nach jeder Überarbeitung neu runterladen zu müssen, dachte ich mir ich könnte es ja mal mit einem Launcher probieren.
Der Launcher soll im Grunde zwei Sachen können:
Die entsprechenden Spieldateien von einer bestimmten Internetseite herunterladen, diese irgendwo speichern und eine bestimmte von den Dateien aufrufen.
Und da seid ihr gefragt 
Ich kenne mich nämlich garnicht mit Netzwerkprogrammierung aus.
Bis jetzt habe ich es geschafft ein Programm zu implementieren, das zwei Knöpfe und ein kleines Textfeld mit Infos hat (die dann auch von der Website kommen sollten).
Der Spielen-Knopf macht noch garnichts und der Patchen-Knopf hat bis jetzt nur eine URL und einen OutputStream definiert.
Wie schaffe ich es jetzt aus der download-URL die entsprechende Datei zu bekommen?

Gruß Messoras


----------



## Androbin (9. Feb 2015)

[Java] Datei downloaden?

```
package downloader; 


import java.io.File; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.ProtocolException; 
import java.net.URL; 


public class Downloader { 
        public static void downloadFile(String url_str, OutputStream os) 
            throws IllegalStateException, MalformedURLException, 
            ProtocolException, IOException { 


        URL url = new URL(url_str.replace(" ", "%20")); 


        HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 


        conn.setRequestMethod("GET"); 


        conn.connect(); 


        int responseCode = conn.getResponseCode(); 


        if (responseCode == HttpURLConnection.HTTP_OK) { 


            byte tmp_buffer[] = new byte[4096]; 


            InputStream is = conn.getInputStream(); 


            int n; 


            while ((n = is.read(tmp_buffer)) > 0) { 
                os.write(tmp_buffer, 0, n); 
                os.flush(); 
            } 


        } else { 
            throw new IllegalStateException("HTTP response: " + responseCode); 
        } 
    } 


    public static void main(String[] args) { 
        try { 
            final String url = "http://www.unixboard.de/vb3/images/element/misc/logo_blue.gif"; 


            FileOutputStream fos = new FileOutputStream(System 
                    .getProperty("user.home") 
                    + File.separator + "logo.gif"); 


            downloadFile(url, fos); 


            fos.close(); 
        } catch (Exception e) { 


            e.printStackTrace(); 
        } 
    } 
}
```


----------



## michaels (9. Feb 2015)

Warum selber bauen?
Im Prinzip suchst du doch JavaWebStart!? Allerdings hat es auch einige Macken...als mögliche Alternative vielleicht Getdown?


----------



## Messoras (10. Feb 2015)

Hey Androbin,
Ich habe mal deine Methode ausprobiert.
Klappt super! Jetzt habe ich nurnoch das komische "MALFORMED" Problem 
Ich habe das ganze mal so implementiert:

```
try {
            final String witzignet = "http://witzigfahren.jimdo.com/app/download/9884796894/Witzigfahren%20(3.1.1).zip?t=1423413097";
            FileOutputStream fos = new FileOutputStream("data/");

            downloadFile(witzignet, fos);
 
            fos.close();
        } catch (Exception ex) {

            ex.printStackTrace();
        }
```
Jetzt bekomme ich "data" als .zip Datei raus und dadrin ist alles, wie es sich gehört, ich kann es entpacken und habe dann das, was ich haben wollte 
Ich habe mal noch die Entpackungsmethode von tutorials.net reingehauen, dabei bekomme ich zwar fast alles so raus, wie ich es will, aber ich bekomme so eine merkwürdige Fehlermeldung: "java.lang.IllegalArgumentException: MALFORMED"
bei dem Code

```
ZipEntry entry = (ZipEntry) entries.nextElement();
```
 in der while-Schleife
und sowohl ein paar Bilder (pgns), als auch die .jar Datei fehlen in der entpackten Datei.
Schonmal vielen Dank für den Teil

Dann fehlt mir nurnoch das aufrufen einer .jar Datei in dem, was ich heruntergeladen habe.

Gruß Messoras


----------



## Androbin (10. Feb 2015)

"malformed" ist Englisch für "deformiert", "missgebildet" oder auch "missgestaltet".
Damit sind die Fehler in der ZIP-Datei gemeint, da sind offensichtlich Fehler bei passiert.

Die JAR-Datei kannst du dann wie jede andere aufrufen, sofern bereits eine existiert, wenn du kompilierst.
Was du dann im Nachhinein an der JAR-Datei änderst ist Java egal, Hauptsache, es hat sie beim kompilieren gesehen.


----------



## VfL_Freak (10. Feb 2015)

Moin,


Messoras hat gesagt.:


> Ich habe das ganze mal so implementiert:
> 
> ```
> "java.lang.IllegalArgumentException: MALFORMED"
> ...


Ich hatte neulich auch so ein Problem!
Im vermute ganz stark, dass es im ZIP-File Dateinamen mit Umlauten gibt!
Das war es bei mir - damit kommt der Zipper nicht klar !!

Gruß Klaus


----------



## Messoras (10. Feb 2015)

Tatsache, es lag daran, dass ich eins der Bilder "Kästen" statt "Kaesten" genannt habe 
Geändert und schon klappt's.
Danke soweit.

Jetzt alles, was mir noch fehlt:
Der Launcher sollte nicht bei jedem Start die Dateien neu herunterladen, also müsste irgendwie auf einfachem Wege ein schneller Versionsabgleich erfolgen...
Dafür könnte ich vermutlich einen zweiten kleinen Download hinzufügen, der nur die Versionsnummer beinhaltet, aber das geht sicherlich auch einfacher.
Das andere wäre die Sache mit dem Aufrufen der .jar.
Geplant ist, dass so ähnlich wie bei Minecraft z.B. ein Klick auf den Patch Button entweder sagt, dass die Version aktuell ist, oder sie neu runterlädt und ein Klick auf den Spielen Button die .jar mit dem Spiel öffnet... Wie rufe ich aus einem JFrame denn jetzt diese .jar auf? 

Gruß Messoras


----------



## Messoras (10. Feb 2015)

Soo, jetzt habe ich es soweit 
die actionPerformed für den SPielen Knopf sieht jetzt so aus:

```
try {
                        ProcessBuilder pb = new ProcessBuilder("java","-jar","data/Witzigfahren_"+version+"/Witzigfahren spielen.jar");
                        pb.start();
                    } catch (Exception ex) {

                        ex.printStackTrace();
                    }
```
Dafür musste ich die Dateien zwar erst noch ein wenig herumschieben, aber jetzt klappt es 
Danke für die schnelle Hilfe Leute!

Gruß Messoras


----------

