Komplexes Netzwerk-Spiel im Internet

Hallo zusammen!

Ich arbeite in einer Gruppe an einem relativ umfangreichen Spiele-Projekt und bin hier für den Online-Part zuständig.

Hier erstmal ein paar grundlegende Informationen:

  • Generelle Umsetzung mit MVC-Modell
  • Es wird einen Offline-/Singleplayer-Modus mit entsprechenden Controller-Klassen geben.
  • Eigener Server ist vorhanden. Persistente Daten sollen in MySQL-Datenbanken gespeichert werden.
  • Spieler sollen über eine Lobby ein Online-Spiel mit einem anderen Spieler beginnen können.
  • Im laufenden Online-Spiel soll eine Chat-Funktion integriert sein
  • Es handelt sich nicht um ein Runden-basiertes Spiel. Dass beide Spieler also auf dem möglichst gleichem Stand sind, was die Ansicht angeht, ist ziemlich wichtig
  • Da das Online-System mit einer Rangliste fungiert, soll eine Manipulation (Cheaten) der Spieler möglichst verhindert werden
  • Vor dem Betreten der Lobby, muss sich der Spieler auf dem Server anmelden(es muss also zuvor ein Account angelegt werden)
  • Sämtliche virtuelle Besitztümer des Spielers im Spiel werden ausschließlich auf dem Server gespeichert. Online- und Offline-Spiel sind somit strikt von einander getrennt.

Ich möchte gerne von Anfang an die ganze Client-Server-Architektur möglichst "professionell" aufbauen, um Sicherheit(Account-Hack, Cheat, Abfangen von Datenströmen) und Zuverlässigkeit(möglichst viele Online-Spiele) auch bei größerer Nachfrage zu gewährleisten.

Die entscheidenden Fragen liegen hier eher bei der gesamten Architektur, als bei der Implementierung.

Meine Ansätze:

Verbindung:
Auf dem Server existiert eine MainServer-Klasse, die an einem Port lauscht und ankommende Anfragen an ConnectionHandler(Thread) weiterleitet.
D.h. jeder Client ist einem eigenen ConnectionHandler zugewiesen, der mit dem Clienten kommuniziert.
Der ConnectionHandler ist auch für das Login-Verfahren des Spielers verantwortlich.
Solange der Spieler nicht erfolgreich eingeloggt ist, nimmt der ConnectionHandler keine Anfragen außer "Einloggen" und "Verbindung Trennen" entgegen.
Haben zwei Spieler ein Spiel gestartet, werden die jeweiligen ConnectionHandler einem MatchHandler(Thread) übergeben, der dann die direkte Kommunikation zwischen den Spielern ermöglicht.


Kommunikation:
Die Verbindung wäre somit eine TCP-Verbindung zwischen Client und Server.
Die komplette Spiellogik (Controller-Klassen) findet auf dem Server statt um Manipulationen vorzubeugen.
Macht der Spieler bei sich also eine Eingabe, sendet der Client einen Stream an den Server.
Dieser würde dann aus einem "Anfangscode" und dem generellen Inhalt bestehen.
Der Anfangscode dient dem Server zur Identifizierung der Anfrage(Ist dieser Stream eine Nachricht? Oder ein Spielereignis? Etc.).
Der dahinter folgende Inhalt des Streams wäre dann der "Methodenaufruf" inkl. Parameter.
Hier habe ich mir überlegt Hexadezmalwerte zu verschicken, die der Server eindeutig einer Methode zuweist und diese dann mit dem angehängtem Parameter aufruft.

Beispiel: $TYP$METHODE$PARAMETER1$PARAMETER2$...

Das gleiche Prinzip wird auch für Nachrichten vom Server an den Client genutzt.

Drück also der Spieler einen Knopf, wertet der Server über die Controller-Klassen die Aktion aus und schickt Änderungen an beide Spieler zurück, damit diese ihre Ansicht aktualisieren.
Das Spiel läuft somit komplett Server-seitig. Der Client dient im Grunde nur noch zur Anzeige und Nutzereingabe.


Sicherheit:
Um Manipulationen am Online-Spiel(offline ist dies egal), d.h. Spielverlauf und Daten zu verhindern habe ich mir ebenfalls Gedanken gemacht.
Die Verbindung mit dem Server wird mit SSL aufgebaut, d.h. die Kommunikation verschlüsselt.
Bei jeder Anfrage schickt der Client den Hashcode des gesamten Programms mit. Dieser wird beim Starten des Spieles einmal berechnet. Jede vorhandene Klasse gibt ihren eigenen Hashcode wieder und diese werden in einer speziellen Klasse zusammengefügt.
Ich als Entwickler kenne alle Versionen meines Spieles und somit auch alle Hashcodes und könnte diese auf dem Server vergleichen.
Wenn ein nicht bekannter Hashcode vom Client kommt, kann ich also davon ausgehen, dass das Programm manipuliert wurde oder eine nicht mehr zulässige Version des Spieles nutzt und somit jede weitere Anfrage abblocken.
Des weiteren wird immer überprüft ob der Spieler noch eingeloggt ist. Ein Spieler kann sich nur "einmal gleichzeitig" einloggen, was eine Manipulation durch mehrere Spiele-Instanzen verhindern soll.



Leistet dieses Modell die von mir geforderte Sicherheit und Stabilität?
Wären andere Lösungsansätze effizienter?
Was muss ich noch beachten?

Ich hoffe mein Anliegen ist einigermaßen deutlich geworden.
Wenn nicht, einfach nachhaken! :)

Schon mal vielen Dank für eure Hilfe!
 
Zuletzt bearbeitet:
T

tuxedo

Gast
Da du es "professionell" aufziehen willst:

Zum Thema Verbindung:

* Netty
* MINA
oder sonst ein Framework das die den Verbindungskrempel abnimmt und dich beim entwickeln des benötigten Protokolls unterstützt.

Zum Thema Kommunikation:

TCP oder UDP... Kommt drauf an wie echtzeit das ganze laufen soll. Die Geschwindigkeit eines Ego-Shooters erreichst du mit TCP eher weniger. Die Geschwindigkeit von einem MMORPG: Da reicht auch TCP only.

Hier habe ich mir überlegt Hexadezmalwerte zu verschicken, die der Server eindeutig einer Methode zuweist und diese dann mit dem angehängtem Parameter aufruft.

Wieso willst du das Rad neu erfinden? Das gibt's schon. Nennt sich "Remote Procedure Call" und wurde mit RMI, SIMON und anderen Libs schon mehrfach implementiert. Was würde deine implementierung so besonders gegenüber den anderen machen?

Vielleicht schaust du erst mal wie andere vergleichbare Spiele ihr Protokoll aufgebaut haben. Bei World of Warcraft kannst du hier schauen: mangos foundation — the free, open source World of Warcraft server (C++) Bei Lineage2 kannst du hier abschauen: L2j Server Project (Java)
Gibt noch andere frei verfügbare Server wo man gucken könnte.

Zum Thema Sicherheit:

Um Manipulationen am Online-Spiel(offline ist dies egal), d.h. Spielverlauf und Daten zu verhindern habe ich mir ebenfalls Gedanken gemacht.
Die Verbindung mit dem Server wird mit SSH aufgebaut, d.h. die Kommunikation verschlüsselt.

Sorry, aber professionell wirkt es nicht wenn du SSH mit SSL verwechselst.
Und wenn ich mich recht erinnere, dann verhindert SSL nur, dass Dritte in die Verbindung eingreifen können. Wer aber Server oder Client kompromittiert, kann die Verbindung manipulieren.
WoW z.B. setzt auf der TCP Verbindung auf Protokollebene eine eigene Verschlüsselung ein. Die ist zwar nicht schwer zu knacken, aber im Protokoll werden die Nachrichten mit sogenannten OP-Codes identifiziert. Nur wenn Server und Client das gleiche Verständnis von OP-Codes haben, funktioniert die Kommunikation. Wenn man genug Zeit hat, findet man auch heraus welcher OP-Code was bedeutet und "könnte" die Daten manipulieren. Aber der Hersteller ist dazu über gegangen regelmäßig die OP-Codes neu durchzuwürfeln. Damit geht die Suche nach "Welcher OP-Code bedeutet jetzt was" ständig von vorne los.

Alles in allem: Schau was andere fabriziert haben und lerne daraus...
 
M

Marcinek

Gast
Leistet dieses Modell die von mir geforderte Sicherheit und Stabilität?
Wären andere Lösungsansätze effizienter?
Was muss ich noch beachten

Das sind komplexe Fragestellungen, die ohne eine Codereview nicht 100 % beantwortet werden können.

Wenn du einen Server implementierst, dann musst du Dir gedanken über die Skalierbarkeit machen. Was passiert bei 10 Spielern und was bei 10000.

Jedes Java Programm kann ich manipulieren und er schickt immernoch korrekte Hashwerte zurück.

SSL schützt dich vor man in the middle Attacken. Aber wenn ich der Client bin, dann kann ich alles schicken, was ich will.

Hört sich viel nach "Das Rat neu entwickeln" an. Das ist in der Softwarebanrche hochgradig ineffizient. Hierfür gibt es bestimmt schon Frameworks, die entsprechende Kommunikation machen.
 
Erstmal danke für eure Antworten!

Ich meinte natürlich SSL und nicht SSH! Bin noch ein wenig müde.^^

Ich habe noch eine wichtige Sache vergessen zu erwähnen.
Der Server soll evtl. in Zukunft auch mit Clienten kommunizieren können, die nicht in Java geschrieben sind.
Würde aus diesem Grund RPC nicht wegfallen?

Ich möchte das Rad auf keinen Fall neu erfinden!

Falls meine Probleme bereits gelöst wurden wie ich es brauche, würde ich natürlich auf bestehende Lösungen zurückgreifen.
Nur leider habe ich hier keine Ahnung.

Ich werde jetzt erstmal dem Rat folgen und schauen was "andere fabriziert haben". :)

Falls aber noch spontane Vorschläge vorhanden sind, immer her damit! :)
 
T

tuxedo

Gast
Mit RPC ist es nicht unmöglich sprachübergreifend zu kommunizieren. Aber einfach ist das wirklich nicht. Würde RPC hier echt nicht nehmen, sondern auf ein anständiges, fundiertes Protokoll aufsetzen. Damit's skalierbar ist würde ich zu MINA oder Netty greifen. Oder mit Java 7 AIO das ganze selbst machen. Aber die genannten Frameworks sind langerprobt, performant und unterstützen dich prima bei der implementierung eines eigenen Protokolls.

- Alex
 
Zuletzt bearbeitet von einem Moderator:

c_sidi90

Top Contributor
Wir sind momentan auch dabei ein großes C++ Projekt (Spiel) nach Java zu portieren und haben uns MINA und NETTY zu Beginn angeschaut und getestet. Unsere Wahl viel im Endeffekt auf NETTY. Begründung: Bessere Dokumentation, guter Support, besser zu handeln und weniger Code zu schreiben als mit MINA.
 
T

tuxedo

Gast
Auf AltDevBlogADay gibt es zwei interessante Artikel zu RMI über Websockets.

Das könnte man evtl. in der ein oder anderen Variante sicher auch Cross Plattform fähig bekommen.

Oh man.. Wieso wird hier alles verdreht? Du meinst RPC, nicht RMI.

RPC == Die Technik des "entfernten Methodenaufrufs"
RMI == Remote Method Invocation == Eine konkrete RPC Implementierung für/in Java.

Da ist wie gesagt nicht viel mit Sprachunabhängigkeit (mit dem IIOP Protokoll für RMI kannst du ggf. über Corba mit anderen Sprachen sprechen: IIOP ? Wikipedia. Aber wer will schon freiwillig Corba?!). Cross-Plattform: Ja, solange es Java bleibt.

- Alex
 

Evil-Devil

Top Contributor
Ich weiß das ich RPC meinte. In den Links geht es gerade darum nicht RMI für RPC zu nutzen sondern einen eigenen schlankeren Weg einzuschlagen. Zb. über Websockets via JSON. Und das wäre dann nahezu Sprach/System unabhängig.

Für die direkte Kommunikation zwischen Client und Server würde ich aber die schon angesprochenen OpCodes empfehlen.

Will hier keinen Streit vom Zaun brechen ^^"
 

Empire Phoenix

Top Contributor
Also gerade bei shooter hnlcihen spielen macht es sinn die Netzwerkebene auf nio der aio ebene selber zu schreiben, da man dann auf bytebuffer ebene wesentlich effizienter daten transferieren kann (zb Messages je nach typ über tcp oder über udp übertragen, inclusive fallback auf tcp only wenn udp nicht durch die firewall kommt) Mit aio habe ich bislang ncihts gemacht, aber gerade bei nio kann man eine toSend queue nehmen, und gut anhand der anzahl der objecte darinnen andere paramter autoamtisch anpassen (zb bei clients mit langsamen internet die world update rate runtersetzten und mehr mit interpolation arbeiten)
 

ice-breaker

Top Contributor
Empire Phoenix, das gleiche kannst du aber auch auf Netty-Basis machen, du musst dann eben nur noch einen Layer über Netty drübersetzen der dann die NAchrichten auf TCP oder UDP verteilt. Auch mit dem Zählen von Objekten in der Queue könnte man da einiges bewirken, eine shared-Variable für die Anzahl an Objekte im Send-Buffer, wird das Objekt durch den Netty-Handler in die Byte-Daten transformiert, dann dekrementierst du den Zähler eben.
Das ganze mag nicht so genau sein, wie alles selbst zu bauen, birgt jedoch auch viel weniger Probleme, denn fertige Frameworks sind seit Jahren erprobt und in tausenden Deployments im Einsatz, da wird weit weniger ein schwerer Fehler drinne sein, als wenn man versucht das Rad neu zu erfinden und selbst ein NIO-Framework schreibt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I ActiveMQ-Messages übers Netzwerk Netzwerkprogrammierung 13
M Socket Netzwerk Übertragung zwischen 4 Clients Netzwerkprogrammierung 2
temi (Netzwerk-) Kommunikation zwischen Anwendungen. Wie? Netzwerkprogrammierung 5
W Das Netzwerk entfernen mit Wifi Manager Netzwerkprogrammierung 1
F Neuronales Netzwerk - Genetischer Algorithmus Netzwerkprogrammierung 0
windl Sporadische Aussetzer im Netzwerk Netzwerkprogrammierung 10
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
MaxG. Netzwerk Ping falsches ergebnis Netzwerkprogrammierung 7
T Netzwerk Login Felder ansprechen Netzwerkprogrammierung 1
B Netzwerk - Fernsteuerung Netzwerkprogrammierung 1
S Netzwerk-Framework gesucht Netzwerkprogrammierung 6
J Hilfe beim programmiern einer App zur Anmeldung im Wlan-Netzwerk Netzwerkprogrammierung 0
C Netzwerk Portzuweisungsproblem Netzwerkprogrammierung 0
I PingPong Spiel übers Netzwerk Netzwerkprogrammierung 1
M Verbindung zwischen zwei Pc in dem Selben Netzwerk Netzwerkprogrammierung 8
M PongSpiel Netzwerk Netzwerkprogrammierung 1
D Geräte im Lokalen netzwerk auflisten Netzwerkprogrammierung 1
fLooojava Daten an ein Arduino im selben Netzwerk senden Netzwerkprogrammierung 1
I Netzwerk FileShare Program Netzwerkprogrammierung 2
K ByteArray über Netzwerk senden klappt nicht Netzwerkprogrammierung 5
D Ermitteln ob WLAN-Netzwerk UDP unterstützt Netzwerkprogrammierung 1
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
B WebSocket Verbindungsaufbau aus localen Netzwerk Netzwerkprogrammierung 2
S Bilder durch's Netzwerk usw ... Netzwerkprogrammierung 10
Kr0e Dezentrales Soziales Netzwerk Netzwerkprogrammierung 48
G Klassen über Netzwerk kommunizieren lassen Netzwerkprogrammierung 6
vandread Zugriff auf Soziales Netzwerk mittels Java? Netzwerkprogrammierung 4
P Automatische Host suche im Netzwerk Netzwerkprogrammierung 3
D Socket Class über Netzwerk verschicken Netzwerkprogrammierung 2
S Netzwerk Verbindungsproblem mit Cajo Netzwerkprogrammierung 5
c_sidi90 ideale Lösung, Screen Capture über Netzwerk Netzwerkprogrammierung 3
J ObjectInputStream im Netzwerk Netzwerkprogrammierung 8
T ArrayList über Netzwerk senden! Netzwerkprogrammierung 5
A java im netzwerk anderen rechner runterfahren Netzwerkprogrammierung 3
U Datei über das Netzwerk einlesen und speichern Netzwerkprogrammierung 8
M Netzwerk Programmierung Netzwerkprogrammierung 2
F Netzwerk-Designkonzept Netzwerkprogrammierung 2
D Ring-Netzwerk - wie fange ich an? Netzwerkprogrammierung 3
X Password übers Netzwerk schicken jPasswordField Netzwerkprogrammierung 2
M Socket Bilder über das Netzwerk übertragen Netzwerkprogrammierung 4
c_sidi90 Alle Rechner im Netzwerk ermitteln Netzwerkprogrammierung 17
D Netzwerk-To-Do-Liste Netzwerkprogrammierung 5
Semox Socket Selbstgeschriebenen Webserver im lokalen Netzwerk publizieren? Netzwerkprogrammierung 4
S Socket nach anderen clients im netzwerk suchen Netzwerkprogrammierung 3
T Netzwerk-Dateiübertragung optimieren Netzwerkprogrammierung 15
G Netzwerk Speed checken Netzwerkprogrammierung 3
L Socket Socketverbindung nur im lokalen Netzwerk Netzwerkprogrammierung 12
F Char über Netzwerk senden Netzwerkprogrammierung 6
P SocketServer im lokalen netzwerk suchen Netzwerkprogrammierung 2
I Objekte über das Netzwerk Netzwerkprogrammierung 5
B RMI RMI, Callback und Netzwerk Netzwerkprogrammierung 6
agent47 IP Adressen im Lokalen Netzwerk Scannen Netzwerkprogrammierung 7
S Netzwerk und Objekte Netzwerkprogrammierung 5
G Netzwerk IP Frage Netzwerkprogrammierung 4
Akrillo Datei per Netzwerk senden Netzwerkprogrammierung 10
W funktionen übers netzwerk nutzen Netzwerkprogrammierung 4
Kr0e Versenden von Daten übers Netzwerk Netzwerkprogrammierung 30
M upnp Device-Discovery im Netzwerk Netzwerkprogrammierung 5
T Administration von Software auf Clients im Netzwerk Netzwerkprogrammierung 6
H MySQL übers Netzwerk Netzwerkprogrammierung 9
A Probleme mit kleinem Netzwerk Programm Netzwerkprogrammierung 30
T Pfadangabe beim kopieren übers Netzwerk Netzwerkprogrammierung 5
G Verschlüsselte Strings über Netzwerk verschicken Netzwerkprogrammierung 19
D robustes Netzwerk Netzwerkprogrammierung 2
N HTML-Übertragung im lokalen Netzwerk mit Java - wie? Netzwerkprogrammierung 6
G Datei performant im Netzwerk verschieben Netzwerkprogrammierung 4
D BufferedImage über das Netzwerk senden Netzwerkprogrammierung 2
E Netzwerk Fehlererkennung Netzwerkprogrammierung 11
M Pc's im Netzwerk auflisten Netzwerkprogrammierung 2
T Welches Netzwerk ist am bestern für. Netzwerkprogrammierung 2
ModellbahnerTT Problem feste String ins Netzwerk zu geben Netzwerkprogrammierung 5
A IRC-Server für das lokale Netzwerk? Netzwerkprogrammierung 12
TheJavaKid Anzahl der Server im Netzwerk Netzwerkprogrammierung 7
R Spiel auf Netzwerk auslegen? Netzwerkprogrammierung 10
R Applet & Netzwerk Netzwerkprogrammierung 4
K netzwerk durchsuchen Netzwerkprogrammierung 10
A array übers netzwerk (anfänger) Netzwerkprogrammierung 8
T Möglichkeit über das Netzwerk eine Funktion zu starten? Netzwerkprogrammierung 2
flashfactor Dateien im Netzwerk kopieren Netzwerkprogrammierung 2
R File chooser übers Netzwerk Netzwerkprogrammierung 3
A Betriebssystem über Netzwerk ermitteln Netzwerkprogrammierung 11
B Netzwerk-IP´s sammeln Netzwerkprogrammierung 16
S Netzwerk übers Internet Netzwerkprogrammierung 30
J Brauche hilfe bei Projekt: Netzwerk Chatprogramm Netzwerkprogrammierung 12
M anpingen, liste aller IPs im netzwerk erhalten Netzwerkprogrammierung 5
S Spiel über Netzwerk. Netzwerkprogrammierung 7
O wie schnell kann java netzwerk sein? Netzwerkprogrammierung 7
D Netzwerk Betrachtung mit vielen Clients Netzwerkprogrammierung 2
D Netzwerk Game, bitte hilfe. Netzwerkprogrammierung 2
L netzwerk mit thread Netzwerkprogrammierung 3
B Netzwerk simulieren Netzwerkprogrammierung 2
8 ByteArray per Netzwerk verschicken Netzwerkprogrammierung 6
P Serialialiserte Objekte übers Netzwerk verschicken Netzwerkprogrammierung 9
T Client-Authorisierung-Netzwerk Netzwerkprogrammierung 4
G Verzeichnis eines Rechners übers Netzwerk auslesen Netzwerkprogrammierung 5
B Netzwerk Dokumentation Netzwerkprogrammierung 2
G MySQL über Netzwerk --> Problem Netzwerkprogrammierung 13
M Netzwerk spiel??? Netzwerkprogrammierung 9
B Nachrichten über das Netzwerk verschicken Netzwerkprogrammierung 3
S Spiel mit Server programmieren Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben