# Highscore ( online )



## feiste (29. Mrz 2011)

Hey,

hab ein kleines Spiel programmiert. 
Jetzt hätte ich gerne eine Highscore mit "double punkte" und "String Name"
am besten mit 10 Eintragungen.
Aber ich hab keine Ahnung wie ich das machen kann,
hab erst seit 3 Monaten im Informatik Unterricht Java.

Ich denke mal man muss punkte und name  in i.eine Datei (vll .txt ?) exportieren
und dannach wieder einlesen. Ist die Annahme schonmal richtig?

Könnte mir dabei vll jemand helfen, weil ich keine Ahnung habe wie ich das machen sollte.
Und wenn es möglich wäre würde ich die Highscore gerne online gespeichert haben
so dass das Programm die Highscore übers Internet einlesen kann.

Danke


----------



## feiste (29. Mrz 2011)

eine Homepage oder so habe ich nicht.
Dachte das geht vll über Webhosting ?


----------



## fastjack (29. Mrz 2011)

Also speichern kannst Du die Liste, indem Du Dir erstmal dafür ein geeignetes Objekt (Hiscore) erstellst. Dann kannst Du schonmal dieses Objekt in verschiedene Formate speichern (Serialisieren, XML, JSON, Text ...).

"Online" speichern kannst Du mit verschiedenen Techniken. Per FTP kannst Du die Hiscoreliste hochladen, per RMI/EJB/Webservices ... kannst Du sie verschiedenen Clients zur Verfügung stellen.


----------



## Volvagia (29. Mrz 2011)

3 Monate ist doch lang. Sobald man hinter den Syntax gekommen ist, weiß man was man machen muss und braucht nur noch die Klassen auswendig zu lernen. ^^
Wenn du die Daten in eine Textdatei schreibst, und wieder liest hast du die Daten, die du eben geschrieben hast.
Ich würde dir davon abraten, weil das zu manipulieren wirklich nicht schwer ist. Aber am simpelsten wäre es wohl, wenn du die Daten per POST oder GET an einen PHP-Skript sendest, der sie speichert.


----------



## feiste (29. Mrz 2011)

3 Monate sind schon lang,
aber nicht, wenn man nur 1std in der woche Informatik hat.

Ist das alles viel aufwand ?
Wenn nicht könnte mir vll jmd die klassen etc. dafür schreiben?

danke


----------



## remy (29. Mrz 2011)

Damit die Highscore tatsächlich online ist, brauchst du einen Server, der von überall aus erreichbar ist. Ein Webserver wäre dafür schon ideal  dazu noch die passende Software auf dem Server wie php (oder direkt einen Tomcat, dann bleibst du Java treu ) und ggf. eine Datenbank.

Jetzt stellt sich die Frage, wie du die Daten an den Server übermitteln willst und wer die Koordination (z.B. Einträge löschen) der Highscore übernimmt. Üblicherweise ist dafür der Server zuständig. Dein Programm muss dann nur noch per geeigneter Schnittstelle (wie schon gesagt wurde: HTTP-POST bzw. -GET) den neuen (potentiellen) Highscore-Eintrag auf den Server schicken. Der Server nimmt den Highscore-Eintrag an, speichert ihn ggf. in einer Datenbank oder in eine Textdatei. Zur Anzeige und Sortierung brauchen wir wieder den Webserver, der uns diese Arbeit abnehmen kann. Wieder per HTTP-GET kannst du auch die aktuelle Highscore in dein Programm laden und anzeigen lassen.

So ungefähr würde der grobe Ablauf aussehen. Wenn du spezielle Fragen hast, immer her damit 

Edit: schwierig ist das ganze nicht wirklich, für einen Außenstehenden aber aufwändig! Wir kennen weder deine Serverkonfiguration (wenn überhaupt vorhanden), der Server muss auf die Annahme der Einträge sowie der Verarbeitung und Persistenz vorbereitet werden und letztendlich dein Programm angepasst werden, das ebenfalls keiner kennt.
Hätte ich all diese Kenntnisse inkl. Serverzugriff, würde ich ca. 30min + Testen brauchen. Bis ich aber diese Kenntnisse von dir habe, ist das Programm vielleicht morgen, vielleicht auch noch später fertig...


----------



## Volvagia (29. Mrz 2011)

Nööööö, du bist der Schüler. 
Um die Highscore lokal abzuspeichern, schau dir mal das an:
Java ist auch eine Insel – 12.14 Persistente Objekte und Serialisierung

Damit wird dir schon fast alles zum Abspeichern und Rekonstruieren aus der Hand genommen, du musst nur noch ein paar Zeilen schreiben. Funktioniert aber nicht mit allen Dingen, aber String, primitive Datentypen und mindestens die meisten Collections, funktionieren.


----------



## Gast2 (29. Mrz 2011)

EDIT:/ oh, viel zu spät


----------



## feiste (29. Mrz 2011)

also wegen manipulation mach ich mir keine sorgen
1. da es nur unter Freunden/Mitschüler gespielt wird (auf das Spiel bekomme ich ne Note)
2. auch wenn jmd "cheaten" würde wäre das auch nicht schlimm


wäre es nicht leichter einfach die Datei ( txt oder so) beim Start des Spiels vom server runterzuladen
und wenn es dann änderungen in der Datei gibt wird die alte einfach gelöscht.
Und die neue hochgeladen.

nur hab ich keine Ahnung wie ich das machen kann.

Kann ja mal das spiel hochladen 
aber bitte keine Kritik, ich denk mal ich hab das alles ziemlich "umständlich" gemacht


----------



## feiste (29. Mrz 2011)

bis jetzt hab ich noch gar nichts, also keine server etc. 
außer das Spiel lads gleich hoch.


----------



## remy (29. Mrz 2011)

es geht auch mit einer Datei, die man auf einen Server hoch- und runterladen kann, natürlich. Dafür brauchst du aber auch wieder einen Server, über den der Dateitransfer (z.B. per FTP, aber auch per HTTP (ggf. etwas kniffliger)) ausgeführt wird.

Für diese Variante mal Volvagias Link folgen und lernen 

Auch wenn du schreibst, dass die Sicherheit nicht im Vordergrund steht, kann es bei gleichzeitiger Benutzung deines Programms zu Inkonsistenz kommen. Laden z.B. zwei Programme gleichzeitig die neue Highscore hoch, geht wahrscheinlich mindestens ein Eintrag verloren (nämlich von dem, der kurz vorher hochgeladen hat).

Edit:


feiste hat gesagt.:


> bis jetzt hab ich noch gar nichts, also keine server etc.
> außer das Spiel lads gleich hoch.



dann solltest du dir erst mal einen besorgen, wenn du es online haben willst  dann kann man sich überlegen, wie die Client/Server-Kommunikation aussehen kann.


----------



## Volvagia (29. Mrz 2011)

Wenn dir das alles wirklich egal ist, und du es nur irgendwie hinkriegen willst (was ich bei Noten aber bedenklicher als in jeden anderen Fall finde), kannst du per URL einen PHP-Skript aufrufen.


```
http://username.meinhost.de/hsspiel.php?action=save&score=500.0&name=Ich
```

Der Skript schreibt die Daten dann am Server in eine Textdatei.
Auslesen würde dann so in etwa gehen.


```
URL url = new URL("http://username.meinhost.de/hsspiel.php?action=read");
InputStream is = url.openStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));
```

Ist jetzt nur die Basis, aber so in etwa geht es.


PS: Das mit den 3 Monaten war nicht ernst gemeint, ich muss ab und zu einfach so einen Blödsinn schreiben.


----------



## fastjack (29. Mrz 2011)

Also ich würde lieber nochmal den Lehrer nachfragen wie das mit dem Internet gemeint ist, alles andere ist nur gerate...


----------



## feiste (29. Mrz 2011)

Volvagia hat gesagt.:


> Wenn dir das alles wirklich egal ist, und du es nur irgendwie hinkriegen willst (was ich bei Noten aber bedenklicher als in jeden anderen Fall finde), kannst du per URL einen PHP-Skript aufrufen.
> 
> 
> ```
> ...




jap sicherheit etc. ist mir ganz egal und auf die Note wird das denk ich mal wenig einfluss haben.
So einfach wie möglich ist mir am liebsten.

also das mit dem Text einlesen hört sich ja gut an 
nur kann der Text auf dem server dann auch verändert werden 
wenn jmd eine neue hicscore hat?

hab das spiel jetzt mal hochgeladen:
File-Upload.net - owndoodlejump.jar


----------



## remy (29. Mrz 2011)

bei einer veränderten Highscore muss die Datei auf dem Server überschrieben werden.

Tipp: Am besten würde sich das Spiel erneut vor dem Absenden der Highscore die aktuelle Datei vom Server laden, falls zwischenzeitlich jemand anders einen neuen Eintrag vorgenommen hat.


----------



## feiste (29. Mrz 2011)

fastjack hat gesagt.:


> Also ich würde lieber nochmal den Lehrer nachfragen wie das mit dem Internet gemeint ist, alles andere ist nur gerate...



unsere Aufgabe ist es einfach i.ein Spiel zu programmieren.
Wir haben auch noch nichts gelernt in Sachen einlesen/internet etc.

das mit der hicscore will ich eher machen, damit wir eben schaun können wer am weitesten gekommen ist und nicht wegen dem Lehrer


----------



## Volvagia (29. Mrz 2011)

Ist doch schon mal nicht schlecht. Aber wer ist der Kerl mit dem Burgerking-Hut? An dem kommt man doch garnicht vorbei. Oo

Ja, das müsste dann PHP übernehmen. Aber wie jack schon sagte, frag am Besten deinen Lehrer(in), wie er/sie es haben will. Wenn dus falsch machst, hat da doch niemand was davon. Oder frag, ob er wirklich Space haben will, oder ob es nur theoretisch sein soll. Weil dann könntest du dir spielend einen Java-Server schreiben.


----------



## feiste (29. Mrz 2011)

am besten nehm ich einen kostenlosen webserver dafür her oder?

könnte mir das jmd machen.
egal wie sicher das ganze dann ist..
hauptsache es funktioniert.


----------



## Volvagia (29. Mrz 2011)

Es ist wirklich sehr einfach. Versuche es mal selbst, wenn du Probleme hast dann kannst du deine Fragen ja immer noch stellen.

Ich war vor längeren ein paar Jahre bei lima-city, hatte mit denen eigendlich nie Probleme.


----------



## feiste (29. Mrz 2011)

Volvagia hat gesagt.:


> Ist doch schon mal nicht schlecht. Aber wer ist der Kerl mit dem Burgerking-Hut? An dem kommt man doch garnicht vorbei. Oo
> 
> Ja, das müsste dann PHP übernehmen. Aber wie jack schon sagte, frag am Besten deinen Lehrer(in), wie er/sie es haben will. Wenn dus falsch machst, hat da doch niemand was davon. Oder frag, ob er wirklich Space haben will, oder ob es nur theoretisch sein soll. Weil dann könntest du dir spielend einen Java-Server schreiben.



unsere Aufgabe ist es einfach i.ein Spiel zu programmieren.
Wir haben auch noch nichts gelernt in Sachen einlesen/internet etc.

das mit der hicscore will ich eher machen, damit wir eben schaun können wer am weitesten gekommen ist und nicht wegen dem Lehrer 

_____________________________



sry hab vergessen die Tastatur zu erklären 


W,A,S,D   spieler lenken
edit:  ( nur A,D   da man nicht nach oben, unten lenken muss)

m: schießen

K und L  kugel lenken (links,rechts)


Den Typ muss man 3mal abschießen


----------



## remy (29. Mrz 2011)

feiste hat gesagt.:


> unsere Aufgabe ist es einfach i.ein Spiel zu programmieren.
> Wir haben auch noch nichts gelernt in Sachen einlesen/internet etc.



Ohne einem Stream oder HTTP-Aufruf wirst du keine Persistenz hinbekommen, dazu musst du dir schon irgendwas aneignen. Es gibt bis jetzt noch keine eingebaute Java-Klasse, die dir mit einem Methodenaufruf diesen Wunsch erfüllen kann :/

Edit: gibts heutzutage nicht auch kostenlose Webserver mit php und ner kleinen mySQL-DB? Wäre m.E. die einfachste und schnellste Möglichkeit. Ansonsten ein kostenloser Server mit FTP-Zugriff, um mit dem Datei-Ansatz weiterzuarbeiten...


----------



## feiste (29. Mrz 2011)

wenns nicht sein muss würd ich mir ungern das alles aneignen.
also wenn man sich auskennt dauert es nicht lange oder?
könnte mir das vll jmd machen?? 


danke


----------



## feiste (29. Mrz 2011)

was ich auch noch nicht habe ist
eine Eingabe für den Namen des Spielers.


----------



## feiste (29. Mrz 2011)

hab mich jetzt mal bei 
lima-city angemeldet

wenn mir jmd das mit der hicscore machen kann
dann schick ich ihm die zugangsdaten.


----------



## feiste (29. Mrz 2011)

File-Upload.net - owndoodlejump1.2.jar

hab hier nochmal bisschen was verändert wegen den punkten.


----------



## feiste (29. Mrz 2011)

niemand? :/


----------



## Haave (29. Mrz 2011)

Du kannst deine Beiträge übrigens bis zu 24 Stunden nach dem Absenden noch bearbeiten


----------



## remy (29. Mrz 2011)

Glaube nicht, dass du so schnell jemanden finden wirst, besonders nicht mit der Einstellung "keine Lust, mich irgendwo einzulesen, mach du mal".
Versuch dich selber dran, dann lernst du auch was dabei. Bei konkreten Fragen wird man dir eher weiterhelfen können. Zumindest den theoretischen Ansatz hast du.


----------



## feiste (29. Mrz 2011)

es ist nicht so, dass ich keine lust auf sowas hab
nur hab ich schon soviel zeit für das spiel investiert,
dass ich jetzt keine lust mehr hab mich in ein weiteres neues thema einzulesen.

Für mich würds halt vll 2-3std dauern bis funktioniert.


----------



## feiste (29. Mrz 2011)

wenn ich es selbst probiere bräuchte ich ne schritt für schritt anweisung
weil ich einfach ka. habe :/


----------



## remy (29. Mrz 2011)

hättest du direkt mit dem Einlesen angefangen, wärst du jetzt schon längst damit fertig 

bis sich jemand anderes in deinen Code eingelesen und eine Lösung für dein Problem geschrieben hat, können es auch 2-3 Stunden werden. Wenn du selber nicht gewillst bist, mindestens den gleichen Arbeitsaufwand einzubringen, warum sollte es jemand anderes für dich tun? Schließlich ist es dein Wunsch für dein Programm, also mach es selbst, dann kannst du auch stolz drauf sein, was geschafft zu haben...



feiste hat gesagt.:


> wenn ich es selbst probiere bräuchte ich ne schritt für schritt anweisung
> weil ich einfach ka. habe :/


gerne doch. Ich nehme mal an, du willst es mit der Datei realisieren, die zur Verteilung auf einen Webserver geladen wird.

Schritt 1: Datei schreiben
Google nach "Java datei schreiben", du wirst genug Erklärungen und Beispiele bekommen. Mach dich mit den Befehlen vertraut, um mit dem FileWriter umgehen zu können.

Schritt 2: Datei lesen
ähnlich wie Schritt 1, Google nach "java datei lesen". Lass dir einzelne Zeilen, die du zuvor geschrieben hast, vom Programm einlesen und z.B. auf die Konsole ausgeben.

Schritt 3: Dateien per FTP senden und empfangen
Hier wird es etwas kniffliger. Ich glaube, in der Standard-Java-Bib gibt es keinen FTP-Client. Apache hat dafür ne Bib, die du einbinden müsstest. Wenn du 2min länger googelst, wirst du dennoch fündig.
Probiere einfach, eine Datei hoch- und wieder runterzuladen. Falls beides geklappt hat, ist dieser Schritt abgeschlossen.

Schritt 4: Schritt 1 bis 3 kombinieren
An dieser Stelle hast du bereits alle Grundlagen und es ist nicht mehr weit. Deine Highscore kannst du nun runterladen, auslesen, in deinem Programm auswerten (z.B. bei mehreren Einträgen: sortieren, neuen Eintrag hinzufügen etc), alles in eine Datei schreiben und wieder hochladen. Fertig 


Wenn du die allgemeinen Schritte 1-3 nachvollzogen hast, helfe ich dir gerne weiter auf die Sprünge, wenn du nicht weiterkommst... notfalls auch schon bei Schritt 3, aber da muss schon Code vorhanden sein.


----------



## Haave (29. Mrz 2011)

"Es ist nicht so, dass ich keine Lust habe, aber ich hab keine Lust" :lol:

Wenn du schon keine Lust hast, warum sollte dann jemand anders hier Lust darauf haben?


----------



## feiste (29. Mrz 2011)

dachte für jmd der sich auskennt dauert das nur 10min oder so.

in meinen quelltext muss man sich ja nicht einlesen.

hab ne  double punkte  und String Name
die sollen hochgeladen werden können und wieder aufgerufen werden können.


----------



## fastjack (29. Mrz 2011)

Was machst Du eigentlich, wenn Du Deine Lösung der Allgemeinheit, die ja noch nicht so bewandert sind, vorstellen sollst? Ich würde das weglassen und nur das machen, was der Lehrer aufgegeben hat.


----------



## feiste (29. Mrz 2011)

ich sag halt dass das jemand anders gemacht hat
ich will die hicscore nicht wegen dem lehrer oder so 
sondern einfach damit man sich austauschen kann mit den punkten..


----------



## remy (29. Mrz 2011)

s.o. in meinem letzten Beitrag... Punkt 2 hättest du jetzt sicherlich abgeschlossen 

aber mal ehrlich: es wird sich keiner die Mühe machen, und "mal eben" dein Programm erweitern, besonders nicht mit der Einstellung "keine Lust".
Da muss schon Eigeninitiative vorhanden sein. Auf der Arbeit muss ich auch grade Programmerweiterungen vornehmen, auf die ich keine Lust hab, aber mich fragt ja auch keiner... oder machst du die für mich?

50 Euro Vorkasse und wir kommen ins Geschäft


----------



## feiste (30. Mrz 2011)

danke für die Anleitung =)
werds mal versuchen!


----------



## feiste (30. Mrz 2011)

in welche datei soll ich es jetzt am besten schreiben ?

html , txt  ... ?


----------



## Volvagia (30. Mrz 2011)

Ist vollkommen egal. Kannst du auch in eine *.bmp, *.xmp, *.javaforum oder *.score schreiben.


----------



## muckelzwerg (30. Mrz 2011)

Nur mal so ...

- Ganz frische Highscores, Du präsentierst Dein Spiel in der Schule, Deine Kumpels und euer Lehrer legen gleich mal los.
- Spieler 1 startet das Programm und lädt die Datei runter.
- Spieler 2 startet das programm und lädt die Datei runter.
- Spieler 1 erreicht 10.000 Punkte, das Programm überschreibt die Datei. Erster Eintrag "leethaxor7331 - 10.000 Points", der Rest ist leer.
- Spieler 2 erreicht 500 Punkte, das Programm überschreibt die Datei. Erster Eintrag "uberNoob - 500 Points", der Rest ist leer.
- Spieler 1 macht Dich dumm an. 

Du hast Webspace und der kann auch gleich noch PHP? Leg eine Highscoredatei auf den Webserver und lass sie Dir von einem PHP-Script dort anzeigen. 
Schreibe ein weiteres Skript, dass mit Nickname und Punktzahl über den Browser aufgerufen wird. Das Skript ordnet den neuen Wert ein (wenn er gut genug ist) und fertig.
Aufruf des Skripts aus Java heraus, mit einem HTTP-Request. Kann man fast blind aus dem Netz kopieren. ^^

Jupp, theoretisch kann man jetzt die Highscores auch von Hand einfach eintragen. Also mal schnell in einem PHP-Forum nach Passwortschutz gefragt (oder sich selbst überlegt) und dann gehts wieder.


----------



## feiste (30. Mrz 2011)

muckelzwerg hat gesagt.:


> Nur mal so ...
> 
> - Ganz frische Highscores, Du präsentierst Dein Spiel in der Schule, Deine Kumpels und euer Lehrer legen gleich mal los.
> - Spieler 1 startet das Programm und lädt die Datei runter.
> ...



ich werds so machen, dass die highscore wenn man das spiel öffnet runtergeladen wird
damit man sie anzeigen lassen kann
und nochmal kurz bevor man seine eigene highscore hochlädt.


----------



## Gonzo17 (30. Mrz 2011)

Hab nicht den ganzen Thread gelesen und weiß daher nicht, ob es schon beantwortet wurde, aber generell eine Frage, weil mich das Thema auch interessiert. Macht es Sinn, wenn man sowas in eine Datenbank schreibt? Kenne mich mit Datenbanken noch recht wenig aus, aber da kann man es sich ja auch sortiert ausgeben lassen soweit ich weiß. Oder eignen sich Datenbanken dafür garnicht?


----------



## Gast2 (30. Mrz 2011)

Ich denke für einen simplen Highscore ist eine Datenbank Overkill. 

Ich würde:
Simplen Server schreiben der einerseits Eingabe von Highscores erlaubt, andererseits die Highscore Liste zurück geben kann.

Der Server selber kann ja die Liste in einem File vorhalten. (Oder auch in einer Datenbank)

Am Einfachsten:
Netty runterladen, EchoServer Beispiel anschaun, ServerHandler anpassen, z.B:

```
public class HighScoreServerHandler extends SimpleChannelUpstreamHandler {

	private final AtomicLong transferredBytes = new AtomicLong();
	  
	      public long getTransferredBytes() {
	          return transferredBytes.get();
	      }
	  
	      @Override
	      public void messageReceived(
	              ChannelHandlerContext ctx, MessageEvent e) {
	          // Send back the received message to the remote peer.
	          transferredBytes.addAndGet(((ChannelBuffer) e.getMessage()).readableBytes());
	          String response = response(e.getMessage().toString());
	          e.getChannel().write(response);
	      }
	  
	      private String response(String message){
	    	  if(message.startsWith("SET")){
	    		  setHighScore();
	    	  }
	    	  return getHighScore();
	      }
	      
	      private void setHighScore(){
	    	  // hier in Datei Schreiben
	      }
	      
	      private String getHighScore(){
	    	  //hier aus Datei lesen
	    	  return null;
	      }
	      @Override
	      public void exceptionCaught(
	              ChannelHandlerContext ctx, ExceptionEvent e) {
	          // Close the connection when an exception is raised.
	          e.getChannel().close();
	      }
}
```

EchoClient ansehn und anpassen. Zum Setzen von einem HighScore einfach den String "SET name;1233" schicken, zum abfragen "GET". Dann den Server starten und gut ist. Das muss ja noch nciht mal ein Server im Internet sein, reicht ja wenn der auf der gleiche Maschine läuft. soll ja nur zeigen das es über das Netzwerk geht. wo der Server steht ist da ja nun egal.


----------



## remy (30. Mrz 2011)

Die Themen php, DB und Sicherheit wurden bereits besprochen und abgelehnt. Der TO möchte es so simpel wie möglich haben, Überschreiben der Highscore etc. wird vernachlässigt, deshalb eben die Idee der Textdatei, die hoch- und wieder runtergeladen wird.



Gonzo17 hat gesagt.:


> Hab nicht den ganzen Thread gelesen und weiß daher nicht, ob es schon beantwortet wurde, aber generell eine Frage, weil mich das Thema auch interessiert. Macht es Sinn, wenn man sowas in eine Datenbank schreibt? Kenne mich mit Datenbanken noch recht wenig aus, aber da kann man es sich ja auch sortiert ausgeben lassen soweit ich weiß. Oder eignen sich Datenbanken dafür garnicht?



Der TO möchte nicht mal eine Liste, sondern einfach nur den besten Wert + Name abspeichern, in diesem Fall ist eine DB tatsächlich Overkill und mehr Arbeitsaufwand als nötig.
Bei einer richtigen Highscore-Liste würde ich schon eine DB benutzen, wenn eine verfügbar ist, denn sie nimmt einem etwas Arbeit ab. Einträge können einfach nur hinzugefügt werden, zum Anzeigen der Liste sortiert mir die DB die Einträge und kürzt sie zudem z.B. auf eine Top 100 - und das alles mit nur einem SQL-Query 
Natürlich wird hier der Funktionsumfang einer DB grade mal angekratzt, dennoch angenehmer, das ganze mit Dateien zu handeln


----------



## feiste (30. Mrz 2011)

remy hat gesagt.:


> Die Themen php, DB und Sicherheit wurden bereits besprochen und abgelehnt. Der TO möchte es so simpel wie möglich haben, Überschreiben der Highscore etc. wird vernachlässigt, deshalb eben die Idee der Textdatei, die hoch- und wieder runtergeladen wird.
> 
> 
> 
> ...




wenn möglich hätte ich gern die besten 10 werte
nicht nur den besten


----------



## Gast2 (30. Mrz 2011)

remy hat gesagt.:


> Die Themen php, DB und Sicherheit wurden bereits besprochen und abgelehnt. Der TO möchte es so simpel wie möglich haben, Überschreiben der Highscore etc. wird vernachlässigt, deshalb eben die Idee der Textdatei, die hoch- und wieder runtergeladen wird.



Aber das ist mit Verlaub gesagt Quatsch. Ein File über das Netzwerk lesen und Schreiben ist genauso aufwendig wie ein Server. 

Weil ich mal nicht so bin das 5 Minuten Werk - der Server:

```
package org.example;

import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

import org.jboss.netty.bootstrap.ServerBootstrap;
import org.jboss.netty.channel.ChannelPipeline;
import org.jboss.netty.channel.ChannelPipelineFactory;
import org.jboss.netty.channel.Channels;
import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;


public class HighScoreServer {
	      public static void main(String[] args) throws Exception {
		          // Configure the server.
		          ServerBootstrap bootstrap = new ServerBootstrap(
		                  new NioServerSocketChannelFactory(
		                          Executors.newCachedThreadPool(),
		                          Executors.newCachedThreadPool()));
		  
		          // Set up the pipeline factory.
		          bootstrap.setPipelineFactory(new ChannelPipelineFactory() {
		              public ChannelPipeline getPipeline() throws Exception {
		                  return Channels.pipeline(new HighScoreServerHandler());
		              }
		          });
		  
		          // Bind and start to accept incoming connections.
		          bootstrap.bind(new InetSocketAddress(8080));
		      }
}
```


```
package org.example;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStreamWriter;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong;

import org.jboss.netty.buffer.ChannelBuffer;
import org.jboss.netty.channel.ChannelHandlerContext;
import org.jboss.netty.channel.ExceptionEvent;
import org.jboss.netty.channel.MessageEvent;
import org.jboss.netty.channel.SimpleChannelUpstreamHandler;

public class HighScoreServerHandler extends SimpleChannelUpstreamHandler {

	private final AtomicLong transferredBytes = new AtomicLong();

	ConcurrentMap<String, String> highscores = new ConcurrentHashMap<String, String>();

	public long getTransferredBytes() {
		return transferredBytes.get();
	}

	@Override
	public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
		// Send back the received message to the remote peer.
		transferredBytes.addAndGet(((ChannelBuffer) e.getMessage())
				.readableBytes());
		String response = response(e.getMessage().toString());
		e.getChannel().write(response);
	}

	private String response(String message) {
		if (message.startsWith("SET")) {
			setHighScore(message.substring(4)); // all after "SET "
		}
		return getHighScore();
	}

	private void setHighScore(String record) {
		// safe highscore
		String[] value = record.split(";");
		highscores.put(value[0], value[1]);

		// write file
		File file = new File("highscores");
		try {
			BufferedWriter out = new BufferedWriter(new OutputStreamWriter(
					new FileOutputStream(file)));

			for (String name : highscores.keySet()) {
				String score = highscores.get(name);
				out.write(name + ";" + score);
				out.newLine();
			}
			out.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private String getHighScore() {

		File file = new File("highscores");
		try {
			BufferedReader reader = new BufferedReader(new FileReader(file));
			String line = null;

			while ((line = reader.readLine()) != null) {
				String[] value = line.split(";");
				highscores.put(value[0], value[1]);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		StringBuilder sb = new StringBuilder();
		for (String name : highscores.keySet()) {
			String score = highscores.get(name);
			sb.append(name + ";" + score+"\n");
		}
		return sb.toString();
	}

	@Override
	public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {
		// Close the connection when an exception is raised.
		e.getChannel().close();
	}
}
```

Der Entsprechende Client besteht aus noch weniger Zeilen.... 

@feisti
Ich habe deine PN gelesen, und ich hab dir den Server hier schon fertig geschrieben. Wenn du jetzt ein bisschen Eigeninitiative zeigst und anfängst den Client zu bauen helfen wir dir gerne. Aber alles mache ich nicht. Nebenbei PNs sind nicht der beste Weg um Hilfe zu bekommen.

Fang an zu verstehen was der Server macht, dann schau dir das hier an:
EchoClient xref
und 
EchoClientHandler xref

Um einen Highscore zu speichern schickst du dem Server den String "SET name;1245" um den score nur abzufragen "GET" oder irgendwas anderes... 

DAs ganze lässt sich natürlich beliebig weiter verkomplizieren.


----------



## Gonzo17 (30. Mrz 2011)

remy hat gesagt.:


> Der TO möchte nicht mal eine Liste, sondern einfach nur den besten Wert + Name abspeichern, in diesem Fall ist eine DB tatsächlich Overkill und mehr Arbeitsaufwand als nötig.
> Bei einer richtigen Highscore-Liste würde ich schon eine DB benutzen, wenn eine verfügbar ist, denn sie nimmt einem etwas Arbeit ab. Einträge können einfach nur hinzugefügt werden, zum Anzeigen der Liste sortiert mir die DB die Einträge und kürzt sie zudem z.B. auf eine Top 100 - und das alles mit nur einem SQL-Query
> Natürlich wird hier der Funktionsumfang einer DB grade mal angekratzt, dennoch angenehmer, das ganze mit Dateien zu handeln



Klar, für einen einzigen Wert wäre das mit Kanonen auf Spatzen geschossen. 
In meinem Fall gehts eher darum Highscore für verschiedene Level und dann eben auf für mehrere Werte anzulegen. Für jedes Level eine Top 10 wäre da für den Anfang schon genug, mit einer Datenbank ist aber eine Top 100 wie du schon sagst genauso einfach, nämlich einfach indem man das SQL-Query anpasst. Danke für deine Antwort, wollte ja nur wissen, ob ich damit auf dem richtigen Weg wäre.


----------



## feiste (30. Mrz 2011)

danke 
also die beiden klassen bau ich jetzt erstmal in mein spiel ein?
in der klasse HighscoreServer ist jetzt "public static void main(String[] args)"
brauch ich das nicht nur zum starten des programms ?
das haben wir in der schule noch nicht durchgenommen, da wir mit BlueJ arbeiten 
und das Programm das von selbst macht.

und dann brauch ich noch einen webspace ?
kann ich da lima-city.de verwenden?

das ganze funktioniert dann über ftp übertragung oder?


kann leider mit den beiden links wenig anfangen :/


----------



## remy (30. Mrz 2011)

fassy hat gesagt.:


> Aber das ist mit Verlaub gesagt Quatsch. Ein File über das Netzwerk lesen und Schreiben ist genauso aufwendig wie ein Server.



Würde ich bei diesen Umständen so nicht unterschreiben. Für das Server-Programm brauchst du einen, genau, Server, der mit Java umgeht. Der mag zu Hause stehen, muss aber angeschaltet und erreichbar sein (dynamische IP, Portweiterleitung im Router...). Wenn der Java-Server die Daten persistent speichern soll, ist es wirklich mehr Arbeit und komplizierter... aber was solls, schreib ihm halt sein Programm 



Gonzo17 hat gesagt.:


> Klar, für einen einzigen Wert wäre das mit Kanonen auf Spatzen geschossen.
> In meinem Fall gehts eher darum Highscore für verschiedene Level und dann eben auf für mehrere Werte anzulegen. Für jedes Level eine Top 10 wäre da für den Anfang schon genug, mit einer Datenbank ist aber eine Top 100 wie du schon sagst genauso einfach, nämlich einfach indem man das SQL-Query anpasst. Danke für deine Antwort, wollte ja nur wissen, ob ich damit auf dem richtigen Weg wäre.


Mit verschiedenen Leveln wird die DB noch ein Stückchen sinnvoller. Eine Spalte für's Level und angepasste Querys lösen auch das Problem


----------



## Gast2 (30. Mrz 2011)

Njein... das ist der Server an den du deine Daten schickst und ließt. Den startest du separat. Erstmal auf deinem Rechner, dann läuft der Server auf Port 8080.


----------



## feiste (30. Mrz 2011)

achso.
ist das ganze auf einem externen server schwieriger?
weil ich will ja meinen rechner nicht wegen dem spiel ständig laufen lassen.


----------



## remy (30. Mrz 2011)

feiste hat gesagt.:


> achso.
> ist das ganze auf einem externen server schwieriger?
> weil ich will ja meinen rechner nicht wegen dem spiel ständig laufen lassen.



Angeblich ja 

Schaltest du das Server-Programm aus, ist auch die Highscore verloren, wenn du die nicht in eine Datei schreibst und wieder auslesen willst... was eins der größten Teile in der von mir vorgeschlagenen Variante. Das einzig "schwierige" wäre noch die FTP-Verbindung, aber auch das lässt sich lösen.


----------



## feiste (30. Mrz 2011)

mir wärs egal mit welcher variante ich es mache
hauptsache es funktioniert dannach 
und ich muss meinen rechner nicht laufen lassen..


----------



## Gast2 (30. Mrz 2011)

remy hat gesagt.:


> Angeblich ja
> 
> Schaltest du das Server-Programm aus, ist auch die Highscore verloren, wenn du die nicht in eine Datei schreibst und wieder auslesen willst... was eins der größten Teile in der von mir vorgeschlagenen Variante. Das einzig "schwierige" wäre noch die FTP-Verbindung, aber auch das lässt sich lösen.



Der Server hält ja die Scores in einer Datei - siehe Quellcode. Wie gesagt: 5 Minuten Arbeit



feiste hat gesagt.:


> und ich muss meinen rechner nicht laufen lassen..



Ich denke es geht erstmal nur um eine Hauaufgabe, also nur Demonstration? Du kannst den Server natürlich auch auf jedem anderen Rechner laufen lassen. Aber um deinem Lehrer zu zeigen das dein Programm im Prinzip die Online Speicherung der Scores kann. 

Mach wie du es willst. Wie du Datein lesen und schreiben kannst siehst du ja auch in meinem Code


----------



## feiste (30. Mrz 2011)

nein unser lehrer verlangt das gar nicht von uns,
da wir das auch noch nicht gelernt haben.
Aber ich möchte bei dem spiel einfach eine highscore 
damit wir unsere erreichten punkte vergleichn können


----------



## muckelzwerg (30. Mrz 2011)

Wenn Du WIRKLICH nur vergleichen willst, warum machst Du dann nicht einfach einen automatischen Screenshot, von den Punkten?
Den könnt ihr euch dann um die Ohren feuern, wo ihr wollt. Auf Facebook, per msn, auf der Schulhomepage, in der Forensignatur, als Emailspam ...

Ich hab so ein bisschen das Gefühl, Du weißt entweder selbst nicht, was Du willst, oder erzählst uns nicht alles.


----------



## feiste (30. Mrz 2011)

nein so will ich das ungern machen.
doch ich weiß genau was ich will:

die punktzahl + spielername (10 höchsten punkte)
sollen in dem spiel angezeigt werden.
die punktezahl + spielname soll dann hochgeladen werden 
und beim programmaufruf wieder runtergeladen werden.


----------



## muckelzwerg (30. Mrz 2011)

Na also. Jetzt hast Du es doch selbst gesagt. "Was ich machen will."
Du willst es, also tu es.  
Wenn Du es nicht kannst, dann lerne es. Wenn Du das nicht willst, dann lass es und verbring Deine Zeit mit was anderem.

Edit: Mach doch zum Anfang überhaupt erstmal eine Anzeige für die Highscores.


----------



## feiste (30. Mrz 2011)

genau 

ich will nur ungern das alles lernen
aber trotzdem in meinem spiel eine online highscore.


----------



## feiste (30. Mrz 2011)

muckelzwerg hat gesagt.:


> Edit: Mach doch zum Anfang überhaupt erstmal eine Anzeige für die Highscores.




die Anzeige der Hicscore ist kein problem.
die punktzahl wird ja auch schon oben rechts im spiel angezeigt.
für die highscore mach ich dann einen extrigen button.

hast du das spiel gesehen?


----------



## schalentier (30. Mrz 2011)

Du kannst dir auch einfach ein Google Docs Spreadsheet anlegen, dieses fuer alle mit Link beschreibbar machen und dort traegt einfach jeder seinen Score und Namen ein, fertsch. Sortieren geht dort ebenfalls super einfach.


----------



## feiste (30. Mrz 2011)

is ne gute idee danke
aber da bescheißt nur jeder.


----------



## muckelzwerg (30. Mrz 2011)

Klar hab ich es gesehen. Ich finds furchtbar.  Die Geschwindigkeit scheint so zu sein, wie in der Fernsehwerbung. Aber wie man mit der Kugel irgendwas treffen soll, ist mir schleierhaft. ^^

In Deinem ersten Beitrag hast Du noch allgemein geschrieben, dass Du "keine Ahnung hast, wie man das machen soll" und "wenn möglich" irgendwas online gespeichert werden soll.
Wenn Du jetzt schon so viel mehr kannst, ist das doch prima.
Red doch auch mal mit Deinen Kollegen, oder hast Du das ganze Spiel alleine gemacht? 
Dann versteh ich wirklich nicht, wo Dein Problem ist. 

Wenn Du was "im Internet" speichern willst, dann brauchst Du einen Rechner, der durchgehend läuft. Wen es nicht Dein eigener sein soll, brauchst Du also einen Server, der das für Dich macht. Das kann kostenfreier Webspace sein, oder was auch immer. Vielleicht kann man sogar über ein Forumsprofil was drehen und Dateien hochladen oder was bei Google nutzen.
Wenn Du das also nicht bloß mal eben so zeigen willst, sondern wirklich dauerhaft laufen lassen willst, dann dauert es sowieso seine Zeit, bis Du passenden Webspace hast. Bis dahin hast Du das Problem doch hundertmal gelöst. Da ist die Webspace-AGB doch komplizierter. 


Edit: Schalentier war schneller. Kann man in die Spreadsheets so direkt per HTTP-Request reinschreiben? Das ist ja mal cool.


----------



## feiste (30. Mrz 2011)

muckelzwerg hat gesagt.:


> Klar hab ich es gesehen. Ich finds furchtbar.  Die Geschwindigkeit scheint so zu sein, wie in der Fernsehwerbung. Aber wie man mit der Kugel irgendwas treffen soll, ist mir schleierhaft. ^^



ich weiß das spiel ist noch nicht gut und bestimmt total umständlich geschrieben 
aber ich hoffe das ändert sich auch noch.

was meinst du mit der Geschwindigkeit?
die ändert sich ja  je nachdem welche schwierigkeit man auswählt

mit der kugel musst du gegner abschießen die im laufe des spiels zufällig erscheinen.


----------



## schalentier (30. Mrz 2011)

feiste hat gesagt.:


> aber da bescheißt nur jeder.



Bei jeder anderen hier genannten Moeglichkeit auch ;-) Google Docs hat aber den Charme, das du ueberhaupt NIX coden musst und alles in maximal 30 Minuten fertig, hoch verfuegbar, stabil und einfach ist. Achso, ich will eigentlich keine Werbung machen, es gibt noch viele andre, aehnliche Projekte. Musste nur mal.. aeh... googlen. :-D


----------



## feiste (30. Mrz 2011)

muckelzwerg hat gesagt.:


> In Deinem ersten Beitrag hast Du noch allgemein geschrieben, dass Du "keine Ahnung hast, wie man das machen soll" und "wenn möglich" irgendwas online gespeichert werden soll.
> Wenn Du jetzt schon so viel mehr kannst, ist das doch prima.
> Red doch auch mal mit Deinen Kollegen, oder hast Du das ganze Spiel alleine gemacht?
> Dann versteh ich wirklich nicht, wo Dein Problem ist.



ich hab ja auch keine ahnung wie ich das mit dem online speichern machen soll. ?
was meinst du damit, wenn du jetzt schon soviel mehr kannst?

nein wir haben zwar das projekt zu 4. aufbekommen, aber die anderen interessieren sich nicht für informatik drum hab ichs allein gemacht.


----------



## feiste (30. Mrz 2011)

schalentier hat gesagt.:


> Bei jeder anderen hier genannten Moeglichkeit auch ;-) Google Docs hat aber den Charme, das du ueberhaupt NIX coden musst und alles in maximal 30 Minuten fertig, hoch verfuegbar, stabil und einfach ist. Achso, ich will eigentlich keine Werbung machen, es gibt noch viele andre, aehnliche Projekte. Musste nur mal.. aeh... googlen. :-D



naja bei den anderen möglichkeiten trägt wenigstens das programm selbst die punkte ein 
und nicht der spieler xD
es ist ja nicht so dass in der klasse lauter leute drinwärn die wissen würden wie man jetzt die punktzahl ändert.


----------



## Haave (30. Mrz 2011)

feiste hat gesagt.:


> genau
> 
> ich will nur ungern das alles lernen
> aber trotzdem in meinem spiel eine online highscore.


"Ich kann nicht Ski fahren, will aber einen Skiwettbewerb gewinnen."

Tja, dann ist dir nicht zu helfen. Bezahl halt jemanden dafür, dass er den Skiwettbewerb für dich gewinnt bzw. dass er dir deinen Online-Highscore bastelt, aber hör auf, andere auszunutzen. Schon unglaublich genug, dass du echt schon einen User dazu bekommen hast, dir bereits die Hälfte der Arbeit zu machen.




			
				http://slash7.com/2006/12/22/vampires/ hat gesagt.:
			
		

> *Identifying Help Vampires*
> […]
> * Does he ask the same, tired questions others ask (at a rate of once or more per minute)?
> * Does he clearly lack the ability or inclination to ask the almighty Google?
> ...


----------



## fastjack (31. Mrz 2011)

Schreib dir doch einen RMI-Server, das geht sehr einfach in ein paar Zeilen. Im Spiel selbst programmierst Du noch ein paar Zeilen Client Code und fertig. Tutorials gibt es im Netz zu Hauf.
Der Server kostet gar nix, du mußt ihn nur auf einem Rechner in der Schule anwerfen und fertig (kannst ihn auch als Dienst installieren). Für die Demonstration wird das ja wohl mehr als ausreichend sein.


----------



## SlaterB (31. Mrz 2011)

Beiträge von anfaenger94 und Antworten in separaten Thread verschoben
http://www.java-forum.org/netzwerkprogrammierung/115846-online-server-lima-city.html


----------



## Gast2 (31. Mrz 2011)

fastjack hat gesagt.:


> Schreib dir doch einen RMI-Server, das geht sehr einfach in ein paar Zeilen. Im Spiel selbst programmierst Du noch ein paar Zeilen Client Code und fertig. Tutorials gibt es im Netz zu Hauf.
> Der Server kostet gar nix, du mußt ihn nur auf einem Rechner in der Schule anwerfen und fertig (kannst ihn auch als Dienst installieren). Für die Demonstration wird das ja wohl mehr als ausreichend sein.



Das war ja auch mein Vorschlag: Server (RMI oder Socket oder was auch immer). 

Aber ich glaube nachdem was ich gelesen habe hapert es einfach am grundlegenden Verständnis (und der mangelnden Bereitschaft sich das anzueignen). Was heißt Server, wo ist der unterschied zwischen TCP, FTP, HTTP und RMI und so weiter. Das bringt so alles nix.


----------

