Download Counter in Java

Hallo,
ich möchte in einem Java Programm einen Download Counter integrieren, ich habe mir es so vorgestellt, dass der Client meinem Server die Download Info gibt und diese dann in einer Datei hinzugefügt wird, welche später mit einer Repo gesynct werden, Problem an der Sache, ich kenne mich nicht sehr viel mit Netzwerkprogrammierung aus, aber eben mit dem Internet. Mein Server läuft auf Ubuntu, ich Suche die einfachste geschützte Möglichkeit das umzusetzen, kann mir da jemand helfen? PHP würde für mich sehr günstig sein, wenn das leicht umzusetzen ist.
Danke schon mal!

Ist mir ehrlich gesagt nicht ganz klar. Meinst du einen Fortschrittsbalken (10 von 240 MB)?

Und damit wirds dann ganz abstrus :wink:

Falls du einen einfachen Fortschrittsbalken für Downloads brauchst, dann lässt sich relativ einfach umsetzen indem du mit folgender Methode die Größe der Datei bestimmst:
InputStream (Java Platform SE 7 )
und dann beim Download „mitzählst“ wieviel du schon heruntergeladen hast.

Leider nein, dass habe ich nicht gemeint, ein Download Counter ist die Zahl, die zeigt schon xxxxx mal gedownloaded.

Ok, diese Info müsste ja dann der Server speichern und ausliefern. Inwiefern spielt da dein Java Client mit rein?

Gibts diesen Server Teil eigentlich schon? Falls nein, in welcher Sprache willst du den schreiben?

Server Teil gibt es nicht, der Client sagt dem Server nur, dass es gedownloaded wurde, ich schreibe am liebsten in Java, da ich aber schon einen Apache Server mit SSL habe wäre es glaube ich sicherer PHP zu benutzen.

Na, wenn du am liebsten in Java programmierst und dich mit Servern auskennst, dann kannst du hinter den Apache mit SSL doch auch einfach einen Tomcat schalten (mod_proxy / mod_proxy_ajp). Dann bastelst du ein Servlet und darin kannst du den Counter dann nach Belieben implementieren.

Also du meinst ich soll den Apache Server als Tomcat Proxy benutzen, dann sendet der Client die Info über den Apache Server in das Servlet im Tomcat Server welches dann die Infos in einer Datei speichern kann?

könntest du machen, ist aber etwas viel Aufwand

Problem dabei, die Download Dateien sind nicht auf meinem Server gehostet, also würde das nicht funktionieren.

was ist der Client, ein eigenständiges Java-Programm?
wie werden dort Daten geladen?

oder ein Browser der bisher vielleicht noch gar nichts hat,
soll der mit einem allgemeinen Plugin ausgestattet werden, vielleicht unsichtbar untergeschoben, und beliebige Aktivität des Users loggen? :wink:

sprichst du womöglich von JavaScript statt Java, eine verbreitete Verwechslung?
andere antworteten hier schon weitaus detaillierter, keine Ahnung ob es schon genug Infos gab die nur ich nicht deuten kann,
oder allles völlig vage ist :wink:
im letzteren Fall vielleicht deutlicher werden


in jedem Fall gilt: die Informatierung an einem Server scheint doch die simpelste vorstellbare Verbindung zu sein,
einfach URL aufrufen = 1 Download, bereits eine Information,
evtl. als Parameter den eigenen Username, Größe/ Namen bzw. URL des Downloads einfügen usw.,

schon dabei Probleme, bei der einfachsten möglichen Übertragen(edit: ung) von welchem System auf welches System auch immer?

Ich habe es mit der Tomcat Empfehlung jetzt schon fast geschafft, kurzes Schema:
Java Application -> ruft zb localhost/servlet?id=IDDerDatei auf -> Servlet fügt je nach ID zu einem JSON Objekt etwas hinzu -> wird als JSON gespeichert -> Sync mit der Reposity

Es ist nicht dein Server…

[quote=dav20011;120778]ch habe es mit der Tomcat Empfehlung jetzt schon fast geschafft, kurzes Schema:
Java Application → ruft zb localhost/servlet?id=IDDerDatei auf → Servlet fügt je nach ID zu einem JSON Objekt etwas hinzu → wird als JSON gespeichert → Sync mit der Reposity[/quote]

und du hast einen Tomcat dazu geschaltet? Reife Leistung

Wieso nicht? Er steht bei mir zu Hause, habe ihn selber zusammen gebaut.

Er hat eine dynamische IP(v6)?

Selbst zusammengebaut, steht bei dir zuhause und gehört nicht dir?

Dieser Thread hier ist sehr merkwürdig.

Ich sehe den Widerspruch nicht. Der zählende Downloadlink kann auch eine Weiterleitung an eine andere Adresse sein.

Ich sehe da diverse Widersprüche, liegt entweder am Suff gestern oder daran, dass das Problem so konfus und unverständlich beschrieben wurde

Hast Recht, eigentlich sehe ich die Widersprüche auch. Ich kann mir aber eine Erklärung zusammenreimen :wink: Die ist vielleicht an den Haaren herbei gezogen, ergibt aber zumindest augenscheinlich Sinn.

PHP ist deswegen günstig weil ich schon einen laufenden Webserver habe, nicht im Sinne von Geld. Die Dateien die gedownloaded werden werden natürlich nicht auf meinem Server gehostet, das beste Kabel was in De für Privat Nutzer geht ist 200/20 mbits, und mit 20mbits will man garantiert keine großen Dateien hosten. Eine Weiterleitung wäre auch Sinnlos, ein “Store” hat mehr als nur ein paar Dateien, blöd das mit PHP Weiterleitung zu regeln.
Gleich noch zum Thema:
Wieso bekomme ich hier eine EOFException?
Server:

InputStream input = client.getInputStream();
        OutputStream output = client.getOutputStream();
        ObjectOutputStream obOutput = new ObjectOutputStream(output);
        Statement statement = dataConnection.createStatement();
        ResultSet modList = statement.executeQuery("SELECT modID, downloads FROM modRegister");
        String[][] mods = new String[3][3];
        int column = 0;
        while (modList.next()) {
            mods[column][1] = modList.getString("modID");
            mods[column][2] = modList.getString("downloads");
            ++column;
        }

        System.out.println(mods[1][1]);

        PrintWriter printClient = new PrintWriter(output);
        printClient.println(column);
        printClient.close();
        obOutput.writeObject(mods);
        obOutput.flush();```
Client:

Socket server = new Socket(“localhost”, 25566);
InputStream input = server.getInputStream();
OutputStream output = server.getOutputStream();
ObjectInputStream obInput = new ObjectInputStream(input);
BufferedReader reader = new BufferedReader(new InputStreamReader(input));
String s;
int columns = 0;
while((s = reader.readLine()) != null) {
columns = Integer.parseInt(s);
System.out.println(s);
}
String [][] mods;
TimeUnit.SECONDS.sleep(10);
mods = (String[][])obInput.readObject();```
Auf Stackoverflow konnte mir keiner helfen, die Theorie dass es am frühen closen des Printwriter im Server liegt ist falsch, der Array geht, bloß beim empfangen in der letzten Client Zeile geht nix mehr.

PHP ist deswegen günstig weil ich schon einen laufenden Webserver habe, nicht im Sinne von Geld. Die Dateien die gedownloaded werden werden natürlich nicht auf meinem Server gehostet, das beste Kabel was in De für Privat Nutzer geht ist 200/20 mbits, und mit 20mbits will man garantiert keine großen Dateien hosten. Eine Weiterleitung wäre auch Sinnlos, ein “Store” hat mehr als nur ein paar Dateien, blöd das mit PHP Weiterleitung zu regeln.

kommt mir vor wie völliger Schrott, a la CB

PrintWriter printClient = new PrintWriter(output);
        printClient.println(column);
        printClient.close();
        obOutput.writeObject(mods);
        obOutput.flush();

Erster Blödsinn: obOutput und printClient basieren beide auf dem gleichen Stream output

Du mixt da einen Writer und einen ObjectStream durcheinandner, schreibst erst eine Zahl raus, dann das Objekt

    while((s = reader.readLine()) != null) {
        columns = Integer.parseInt(s);
        System.out.println(s);
    }

Dann versuchst du, zuerst die Zahl wieder zu lesen (was passiert eigentlich, wenn die binäre Objektserialisierung auch ein
enthält??)

SCHMEISS DIESEN QUATSCH RAUS

Die Größe des Arrays kannst du auch dem Array selbst entnehmen…

Egon Spengler: There’s something very important I forgot to tell you.
Peter Venkman: What?
Spengler: Don’t cross the streams.