Netzwerkspiel

Hallo,

danke an beide. Da bin ich schon mal einen Schritt weiter. Strikte Trennung von Server und Client.

Da ich bisher, bis auf eine einzige Vorlesung keine Berührung mit Verteilter Programmierung hatte, ist bzw. war das keine Offensichtlichkeit für mich.

Diese eine Vorlesung, war eine Einführung in CORBA. Die scheidet von vornherein aus.

Java bietet nach meinem eher dürftigen Wissen in diesem Bereich noch folgende Alternativen an:
Sockets über UDP
Sockets über TCP/IP
RMI

Und natürlich viele Abwandlungen, Umsetzungen dieser. Könnte man für meine Zwecke eines dieser favorisieren? Oder anders gefragt, mit welchem dieser würdet ihr den Netzwerkmodus realisieren?


Vg Erdal
 
da ist dann wieder die Frage wie genau das Spiel abläuft, aber bei Multiplayer-Live-Spielen die in Echtzeit laufen sollen, nutzt man in der Regel UDP auf Grund der Möglichkeit von Verlust von Datenpaketen (positiv gemeint)
 
Hallo,

also Prinzipiell gibt es da mal wieder mehrere Möglichkeiten...
wie teilweise schon erwähnt sind bei der Netzwerkprogrammierung die maßgebenden Faktoren Verzögerung
(Lag / Latency), (Garantierte) Übertragung wichtiger Daten und Bandbreite. Diese Faktoren gilt es zu beachten,
um ein perfomante und responsive Multiplayer Anwendung zu erstellen.

Weiterhin gibt es mehrere Architekturen die potentiell in Frage kommen:
Client / Server und P2P (Peer to Peer).

Bei C/S Anwendungen findet die gesamte Systemkommunikation nur über
den Server statt.

Für eine Client/Server basierte Lösung bieten sich normale (Server)Sockets auf TCP / UDP Basis an.
Bei TCP ist die Übertragung garantiert, bei UDP nicht.Das bedeutet das wichtige nicht zeitkritische Daten
per TCP versendet werden sollten. Nicht wichtige nicht Zeitkritische Daten können per UDP versendet werden.
Bei wichtigen und zeitkritischen Daten bietet sich die Verwendung von UDP mit einer eigenen Übertragungskontrolllogik
an die bei Fehlübertragung die geforderte Sequenz erneut sendet (quasi das gleiche wie das was TCP schon von Haus aus macht
nur speziell angepasst an den jeweiligen Bedarf). Natürlich bietet sich hier auch noch die Variante an, pro Client
zwei Verbindungen zum Server aufzumachen. Eine UDP Verbindung für die zeitktischen Daten und eine TCP Verbindung für
die wichtigen aber nicht zeitkritischen Daten.

Weiterhin bietet sich für einfache C/S Anwendungungen auch die Verwendung von RMI an. Das hat den Vorteil,
dass man sich nicht mit Low Level Socket Programmierung quälen muss was jedoch den Nachteil eines erheblichen
Protokoll / ObjektSerialisierungs Overheads mit sich bringt, der für Zeit / Bandbreitenkritische Multiplayer Anwendungen IMHO
nicht hinnehmbar ist.

Beim typischen Client / Server Szenario verbinden sich mehrere Clients zu einem Server welcher für die Verteilung
der Spieldaten eines Clients an alle anderen zuständig ist. Dabei ist dann zu klären, wie die einzelnen Berechnungsaufgaben
zwischen Client / Server verteilt sind. Bei Spielen wie etwa 3D Multiplayer Weltraumsimulationen werden für die Darstellung
einer Spielszene sehr viele Daten benötigt (Position der Spieler, aktuelle Flugrichtung, Energie, Geschwindigkeit, etc.)
Da die Daten potentiell verzögert beim Client ankommen muss der Client gewisse Werte interpolieren um so die Spielszene
halbwegs realistisch darstellen zu können. Kommen die Werte vom Server dann irgendwann an wird die Spielsituation entsprechend
der neuen Daten "smooth" angeglichen so das man möglichst wenig davon mitbekommt. (Na ja, das mal als exkurs ;-)

P2P ist eine Weitere Variante für Multiplayer Anwendungen bei der alle beteiligten Systeme erst einmal gleichberechtigt sind.
D.h. jeder Teilnehmer kann mit jedem anderen Teilnehmer kommunizieren. Hier bietet es sich nun an einen Teilnehmer als
"Server" auszuwählen, der dann die Koordination des eigentlichen Spiels übernimmt und die zentralen Spieldaten (Spielzustand) verwaltet.

Für P2P gibt es für Java zahlreiche Implementierungen:
Beispielsweise:
http://www.jxta.org/
http://www.jgroups.org/javagroupsnew/docs/index.html
( Natürlich kann man über MulticastSockets sowas auch relativ einfach selber bauen:
http://www.tutorials.de/forum/java/241551-netzwerk-udp-multicast-socket-pakete-empfangen.html )

Gruß Tom
 
also das schöne an UDP ist, dass verlorene Datenpakete nicht erneut gesendet werden, nehmen wir an, du läufst auf dem Feld mit deiner Bombermanfigur 2 Kästchen vor, würde bei TCP beim ersten Schritt ein Übertragungsfehler auftreten, würde er das Paket solange senden bis es ankommt, das nächste Paket (Schritt Nr. 2) müsste nun solange warten bis Paket 1 (Schritt 1) empfangen wurde, ist die Anwendung zeitkritisch, ist das natürlich nicht sehr schön, nun könnte man UDP verwenden und wenn das erste Paket verloren geht, ist es weg und das 2. Paket muss nicht warten, in dem Falle wäre es auch gut, da der erste Schritt dann sowieso eine veraltete Positionsangabe ist und man gut darauf verzichten könnte.
Wann man UDP und TCP verwendet ist zT schwer zu entscheiden, denn es ist von dem dahinterliegenden System (Spiel) abhängig, ob Datenpakete immer ankommen müssen, oder auch mal fehlen können, bei einem periodischen Senden von Daten könnte man UDP verwenden, bei einem Event-basierten Senden würde ich jedoch zu TCP raten
 
Hallo Tom,

danke für die ausführlichen Erläuterungen.

Bei CS möchte ich bleiben. P2P ist mir noch zu fremd von der Implementierung her.

Über JGroups habe ich keine einstufende/einordnende/wertende Aussage so jetzt auf die Schnelle im Web gefunden und kann es nicht einschätzen.

Aus der JGroups Homepage werde ich nicht unbedingt schlau, weil es noch Neugebiet für mich ist.

Kannst du bitte in kurzen Worten, die Vorteile von JGroups sagen. Damit ich abwägen kann, ob es sich lohnt sich darin einzuarbeiten, und ob es überhaupt das richtige für mich ist.

Vg Erdal
 
Hallo Tobias,

ich bleib dann doch bei TCP, denn es müssen auch die Punkte gezählt werden, diese dürften dann nicht verloren gehen.

Zwei Verbindungen pro Client eine TCP eine UDP wäre mir dann zu kompliziert!


Vg Erdal
 
Zurück