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