Devilmarkus Geschrieben 2. November 2011 Teilen Geschrieben 2. November 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 2. November 2011 Teilen Geschrieben 2. November 2011 (bearbeitet) 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 2. November 2011 von flashpixx Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Devilmarkus Geschrieben 2. November 2011 Autor Teilen Geschrieben 2. November 2011 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 2. November 2011 Teilen Geschrieben 2. November 2011 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Devilmarkus Geschrieben 2. November 2011 Autor Teilen Geschrieben 2. November 2011 Kann man denn nicht den Java-Buffer irgendwie leeren? Ich habe mir schon einen Wolf gesucht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 2. November 2011 Teilen Geschrieben 2. November 2011 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 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 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Devilmarkus Geschrieben 2. November 2011 Autor Teilen Geschrieben 2. November 2011 Nun, die Datei wird korrekt geändert. Nur halt jedesmal, wenn ich sie neu einlese, steht dort noch im result der alte Inhalt. Auf dem Server ist aber die geänderte Datei. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 2. November 2011 Teilen Geschrieben 2. November 2011 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Devilmarkus Geschrieben 2. November 2011 Autor Teilen Geschrieben 2. November 2011 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! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 2. November 2011 Teilen Geschrieben 2. November 2011 ?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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.