Highscore ( online )

feiste

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:

fastjack

Top Contributor
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

Top Contributor
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

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:

remy

Aktives Mitglied
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...
 
Zuletzt bearbeitet:

feiste

Bekanntes Mitglied
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 :D
 

remy

Aktives Mitglied
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:
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

Top Contributor
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.

Code:
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.

Java:
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. :oops:
 

feiste

Bekanntes Mitglied
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.

Code:
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.

Java:
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. :oops:


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

Aktives Mitglied
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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 ;)
 
Zuletzt bearbeitet:

remy

Aktives Mitglied
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...
 
Zuletzt bearbeitet:

feiste

Bekanntes Mitglied
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
 
Zuletzt bearbeitet:

feiste

Bekanntes Mitglied
hab mich jetzt mal bei
lima-city angemeldet

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

remy

Aktives Mitglied
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

Bekanntes Mitglied
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.
 

remy

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

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...

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.
 
Zuletzt bearbeitet:

Haave

Top Contributor
"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

Bekanntes Mitglied
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

Top Contributor
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

Bekanntes Mitglied
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

Aktives Mitglied
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 ;)
 

muckelzwerg

Bekanntes Mitglied
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

Bekanntes Mitglied
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. ;)

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.
 
G

Gonzo17

Gast
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?
 
G

Gast2

Gast
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:
Java:
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.
 
Zuletzt bearbeitet von einem Moderator:

remy

Aktives Mitglied
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.

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

Bekanntes Mitglied
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.



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 ;)


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

Gast2

Gast
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:
Java:
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));
		      }
}

Java:
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.
 
Zuletzt bearbeitet von einem Moderator:
G

Gonzo17

Gast
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

Bekanntes Mitglied
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

Aktives Mitglied
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 :p

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 :)
 
G

Gast2

Gast
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.
 

Ähnliche Java Themen


Oben