# Client/Server



## Ramulen (19. Aug 2004)

Hiho Javavolk !

Bin gerade dabei ein "Magic"-ähnliches Kartenspiel fürs INet zu proggen (is ne Applikation kein applet).
Ich stehe nun vor folgendem Problem: Meine Applikation soll die Möglichkeit bieten zu entscheiden, ob man nun den server oder den clienten stellt. Ich bin in Sachen Java im Netz noch nicht topfit (hab immer mit php gearbeitet bei so sachen). Wäre super wenn ihr mir ein wenig helfen koenntet. Ein paar einfache Codefragmente sollten reichen um mich weiterzubringen.

Gruß Ramulen


----------



## Grizzly (19. Aug 2004)

Ich verstehe die Frage nicht ganz :bahnhof: . Du möchtest, dass Dein Programm sowohl als Client oder auch als Server gestartet werden kann?

Wenn das die Frage ist, wäre meine Antwort:
In vielen 3D Shootern ist das so gelöst: Man kann einen Client starten und sich auf einem Server einklinken. Oder man startet einen Client, und macht dort ein Spiel auf sprich agiert gleichzeitig auch als Server (nennt man auch "listening server"). Die letzte Möglichkeit ist einen Server direkt und ohne Client zu starten (nennt man auch "dedicated server").

Einige treiben dass sogar noch weiter und lassen auch im Single Player einen Server im Hintergrund laufen, so dass der Client wirklich nur als Frontend agiert und als Backend immer ein Server läuft.


----------



## Ramulen (20. Aug 2004)

Sollte ein "listening Server" werden. Wir kann ich das jedoch realisieren ?


----------



## Grizzly (20. Aug 2004)

Ramulen hat gesagt.:
			
		

> Sollte ein "listening Server" werden. Wir kann ich das jedoch realisieren ?


Wo liegt den genau das Problem?


----------



## Gast (20. Aug 2004)

Bin auf der Suche nach einem einfachem "Beispiel-Code". Hab noch nie was mit server und clients geproggt. Stehe daher etwas auf dem Schlach. Meine Bücher helfen mir nicht grad weiter.


----------



## Grizzly (20. Aug 2004)

Das ist immer noch etwas allgemein. Aber ich _versuche_ mal darauf zu Antworten  :

Erst einmal nimmt man im Client die Einstellungen für den Server vor (Level, Anzahl der maximalen Mitspieler, Schwierigkeitsgrad der K.I., usw.). Dann startet den Client den Server und baut eine Verbindung zu ihm auf. Wenn der Server ein Listening Server ist, ginge das bspw. direkt über einen PipedOutputStream und einen PipedInputStream. Der Client kommuniziert dann halt entsprechend mit dem Server sprich schickt die Aktionen des Spieler hin, bekommt die entsprechenden Daten zum aktuellen Spiel zurück und stellt diese dar.
Andere Clients müssen die Verbindung über einen Socket aufbauen. Cool wäre natürlich da, wenn alle verfügbaren Server / Spiele angezeigt werden würden. Dies kannst Du Dir aber für später aufheben. Im einfachsten Fall gibt der Benutzer einfach den Namen oder die IP Adresse an, und der Client versucht dahin eine Verbindung aufzubauen.

Der Server nimmt - sobald er gestartet wird - über einen ServerSocket eingehende Verbindungen entgegen (außer vielleicht bei dem Client, von dem er als Listing Server gestartet wurde => Piped, s.o.). Diese steckt er dann entweder einfach in einen Vector und arbeitet die dann in regelmäßigen Abständen ab. Oder jede Verbindung bekommt ihren eigenen Thread.
Das erste ist sicher in einfachere Variante und dürfte auch etwas Ressourcen schonender sein. Die zweite garantiert, dass die Anfragen des Clients direkt und relativ zeitnah bearbeitet werden. Dazu musst Du allerdings alle Objekte bzw. Klasse, mit denen diese Threads kommunizieren Thread-sicher machen. Außerdem dürfte bspw. der Speicherverbrauch um einiges höher sein.
Parallel zu dieser Verbindungs-Geschichte bearbeitet der Server die Spiele Logik und prüft die Daten der Clients (Nach dem Prinzip: "Never trust a client.").

Ein Tutorial zu Netzwerk-Kommunikation mit Java findest Du auf der Sun-Seite.

Eine weitere Möglichkeit wäre, dass ganze per RMI zu machen. Dabei ruft der Client eine Methode direkt auf dem Server auf. Funktioniert allerdings nur mit Java.
Ein Tutorial zu RMI findest Du auch auf der Sun-Seite.



Ansonsten stell' einfach etwas konkretere Fragen  . Dann gibt's auch konkretere Antworten  .


----------

