Socket Best Practice: Daten bündeln

pengwolf

Mitglied
Hi,

ich hänge mit einem Freund jetzt schon seit längerem an einem Spiel, das zwischen Server und Client viele verschiedene Daten senden soll. Also einmal das Spielfeld, verschiedene Einzelfelder (wo darf der Held in der nächsten Runde hintreten), Lebenspunkte und Schadenspunkte, wenn ein Kampf stattgefunden hat usw... Wir haben uns schon viele verschiedene Gedanken gemacht, wie man die Daten am besten Bündelt.
Wir sind über JSON gestolpert, haben über RMI nachgedacht, uns ist auch schon nahegelegt worden ein eigenes Protokoll zu schreiben, oder ein 3tes Projekt (Server und Client sind einzelne Projekte) und dort neue Klassen schreiben, welche dann bei Server und Client eingebunden werden und dann, nach Lesen aus dem Stream, wieder gecasted werden können.
Letztere Lösung haben wird jetzt erst einmal beibehalten. Allerdings ist dort das Problem, dass wir uns nicht sicher sind ob dies auch die Beste Lösung ist. Wir haben ein Enum, welches immer die Art des Paketes angibt. Daraus können wir dann ablesen, welche Variablen in der eigentlichen Paket-Klasse gesetzt sind.

Mich würde interessieren, wie Ihr diese Probleme angegangen seit und was die Vor- und die Nachteile bei dem ganzen sind.

Vielen Dank schon einmal.
 
grundsätzlich : logik auf server ... client zeigt nur an und nimmt input entgegen ...

an sonsten : eigenes protokoll wenns halbwegs einfach genug ist ... ansonsten ist objekt-serialisierung grundsätzlich eher eine schlechte als rechte wahl (schließt RMI ein !) ... aber kann man auch nehmen wenn einem die kommunikation selbst egal ist ...
 
Für Datenreplikation (mit oder ohne dedizierten Server) empfehle ich JGroups. Das zu verwendende Protokoll kann jederzeit an die Infrastruktur angepasst werden. Tuningmöglichkeiten bzgl. Verlässlichkeit und optimalte Geschwindigkeit sind inklusive.
 
naja ... wenn es reicht string-nachrichten auszutauschen könnte man nach dem motto aufbauen :

COMMAND[/ARGS]

wobei ARGS sich aus

ARGS0[/ARGS1[/...]]

und dann einfach mit PrintStream und BufferedReader hin und her ... das wäre jetzt ein ganz einfaches string-based protocol ...

das ganze kann man noch runterbrechen in dem man gleich direkt byte-werte schickt ... was das refactoring etwas schwieriger macht ... aber im grundsatz sind so die meisten protokolle aufgebaut ...

oder man nimmt sich beispiele an z.b. HTTP oder der gleichen ...
 
Hey,

ich finde das Protokoll von Minecraft gut und nutze dieses (oder ein ähnliches) selbst in einem Programm.
Bei MC besteht jedes "Paket" aus einer Paket-ID (1 Byte) und dann aus gewissen Daten die du KENNEN must.

Wenn der Server also in Paket #1 ein INT und ein LONG mitschickt muss der Client wissen, dass ein INT und ein LONG ankommen, damit er nach auslesen der beiden wieder beim nächsten Paket ankommt. Die Paket-Klassen wird auf Server und Clientseiten 1zu1 genutzt, dort findest du dann eine Methode "read" in der z.B. "readInt" und "readLong" aufgerufen werden, um die Werte zu bekommen, in der "write" dann eben "writeInt" und "writeLong". Dabei musst du selbst drauf achten dass du auch immer nur genau das ausließt was du auch schreibst.
 

Zurück
Oben