Zum Inhalt springen

Problem mit URLConnection


Devilmarkus

Empfohlene Beiträge

Hallo zusammen,

ich habe folgendes Problem:

Ich möchte eine Highscore-Tabelle während eines laufenden Spieles auf meinem Server aktualisieren.

Ich kann:

-> Die -Highscoretabelle einlesen.

-> Prüfen, ob die Punkte meines aktuellen Spieles dort reingeschrieben werden sollen

-> Die Liste erneut abspeichern.

Nun taucht allerdings folgendes Problem auf:

Obwohl ich, bevor ich die Liste neu abspeichere, erneut einlese, bringt sie nach JEDEM Aufruf immer das gleiche Ergebnis. (Also immer das Ergebnis, welches beim ersten Aufruf gelesen wurde).

Deshalb geht es z.B. nicht, dass mehrere Spieler GLEICHZEITIG das Spiel spielen und die Liste aktuell halten.

Was kann ich nun hier ändern, dass die Datei WIRKLICH jedesmal erneut geladen wird, und nicht irendwo in irgendeinem JavaBuffer herumdümpelt?

    public void checkScores() {

        write = false;

        for (int i = 0; i < display.score.length; i++) {

            if (display.highscores > display.score[i]) {

                display.score[i] = display.highscores;

                display.users[i] = display.user;

                write = true;

                break;

            }

        }

        if (write) {

            try {

                String inputLine = null;

                String result = "";

                scoreurl = new java.net.URL(domain+"/score/" + highs + "/" + highs + ".scores");

                scoreconnection = scoreurl.openConnection();

                BufferedReader in = new BufferedReader(new InputStreamReader(scoreconnection.getInputStream()));

                while ((inputLine = in.readLine()) != null) {

                    result += inputLine;

                }

                in.close();

                System.gc();

                // -SNIP- (Liste wird hier noch weiterverarbeitet, ist aber für das Problem unwichtig

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist ein absolut schlechtes vorgehen. Da bei einem verteilten System hier, die Locks für das schreiben und lesen nicht sichergestellt sind. Außerdem würde man ein solches System via Remote Method Invocation , Common Object Request Broker Architecture oder Webservice umsetzen, damit man eben nicht wie Du die Verarbeitung per Hand umsetzen muss.

Ein manueller Aufruf des GCs sollte man auch nicht durchführen !

Außerdem ist die Problembeschreibung nicht ausreichend für eine Analyse. Im Normalfall kann man nicht einfach Daten auf einen beliebigen Server ändern (Zugriffsrechte).

Bearbeitet von flashpixx
Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun, das mag sicherlich sein.

Die Datei gibt es nur auf meinem Server und das Applet wird auch nur auf meinem Server laufen.

Allerdings habe ich auf meinem Server keinen Shell-Zugriff und kann demnach auch leider keine Scripte/Programme installieren.

Und die Datei ist ja nun auch nur sehr klein (<1k)

Von Remote Method Invocation, Common Object Request Broker, etc... habe ich leider Null Plan.

Könnte mir da Jemand ein kleines Beispiel liefern?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Die Datei gibt es nur auf meinem Server und das Applet wird auch nur auf meinem Server laufen.

Ein Applet läuft auf dem Client nicht auf dem Server !

Allerdings habe ich auf meinem Server keinen Shell-Zugriff und kann demnach auch leider keine Scripte/Programme installieren.

Dann hast Du keine Möglichkeit das Problem zu lösen !

Von Remote Method Invocation, Common Object Request Broker, etc... habe ich leider Null Plan.

Könnte mir da Jemand ein kleines Beispiel liefern?

Bitte einmal eine Suchmaschine Deiner Wahl verwenden

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann man denn nicht den Java-Buffer irgendwie leeren?

Ich habe mir schon einen Wolf gesucht ;)

Nein, um Dateien auf dem Server zu verändern, braucht ein Prozess Schreibzugriff. Dafür muss müssen a) die richtigen serverseitigen Rechte gesetzt sein und B) der Server braucht eben die Möglichkeit zu schreiben, dafür kann man RMI, Corba, Webservice oder WebDAV nehmen, aber alle Techniken müssen dann vom Server unterstützt werden.

Benutze einen Server mit PHP Unterstützung und binde via PHP einen Webservice ein, der den Zugriff auf die Datei ermöglicht. Das Javaapplet muss dann nur auf den Webservice zugreifen

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nun, die Datei wird korrekt geändert.

Auf dem Server ist aber die geänderte Datei.

Wenn man einfach so Daten auf Deinem Webspace ändern kann, solltest Du Dir Gedanken über den Anbieter machen. Das URLConnection Objekt ermöglicht nur den Zugriff auf eine Resource. Natürlich kann man darüber auch Daten versenden (z.B. HTTP Post / FTP).

Warum Du die gleiche Daten wieder einliest, kann man nicht beantworten, denn der Code liefert diese Information nicht. Im Normalfall sollte kein Prozess, selbst nicht der Webserver (http) etwas an einem Webspace ändern dürfen / können. Änderungen sollte nur via FTP / SSH o.ä. und nur durch den Owner der Daten möglich sein.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich habe das Problem relativ simpel lösen können.


                int random = Util.random(999999999);

                scoreurl = new java.net.URL(domain+"/score/" + highs + "/" + highs + ".scores?"+random);

?xxxxxxxxx wird beim Lesen ignoriert, suggeriert dem Programm aber, dass es sich um eine andere Datei handelt...

Und es wäre schon ein riesen Zufall, wenn die Spieler gleichzeitig die gleiche Zufallszahl generieren! ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

?xxxxxxxxx wird beim Lesen ignoriert, suggeriert dem Programm aber, dass es sich um eine andere Datei handelt...

Und es wäre schon ein riesen Zufall, wenn die Spieler gleichzeitig die gleiche Zufallszahl generieren! ;)

Gerade wenn Du ein verteiltest System aufbaust (d.h. es laufen auf einer Anzahl Rechner die gleichen Applets), dann solltest Du Dich nicht darauf verlassen, wenn die Anzahl groß wird, dann können sogenannte Rare Events auftreten.

Wenn Du so etwas machst, dann würde ich eh zu einer Datenbank + Webservice raten. Der Webservice ist dann für das Schreiben der Daten zuständig und über die Datenbank hat man ein entsprechendes Locking.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...