# Grundsatzfragen zu Client-Server-Architektur / Matchmaking



## Athena (10. Mai 2014)

Hallo Leute,

ich möchte ein kleines Multiplayerspiel umsetzen und versuche mir dazu eine geeignete Client-Server-Struktur zu überlegen. In einem Match sollen stets 4 Spieler gegeneinander antreten welche vom Server per Matchmaking zusammengewürfelt werden sollen (vgl. mit dem Matchmaking von league of legends).

Meine Überlegung ist nun, dass ich vom Server aus neue Prozesse (Java-Anwendungen / Server) starte, die das jeweilige Match betreuen. Wie kann ich nun die Clients an diese Server (gleiche IP) weitergeben? Benötigt jede Java-Anwendung / Server einen eigenen Port zur Identifizierung?  Wie macht man das richtig / normalerweise?


liebe Grüße,

Athena


----------



## Streeber (10. Mai 2014)

Ich würde da eher mit Multithreading arbeiten, dürfte auch performanter sein als jedes mal einen komplett eigenen Prozess zu starten. Zumal so wie ich dein Vorhaben verstanden habe da sowieso deutlicher Overhead anfallen würde, wenn du da einen Fronted-Server machen willst der die Connections dann irgendwie an Backend-Server weiterleitet die auch noch eigene Prozesse starten. Grundsätzlich kann ein Port nur von einem Socket, also in deinem Fall einer Anwendung, zur gleichen Zeit genutzt werden. Sprich wenn Anwendung A z.B. auf Port 2345 läuft, kann Anwendung B diesen Port nicht nutzen und müsste etwa 2346 nehmen. Das ganze fällt mit Multithreading aber eh weg, weil es keine verschiedenen Server gibt wo dann irgendwas an Backends umgeleitet wird. Du hast eine Anwendung, in der wird dann für jeden Spieler z.B. eine Instanz der Klasse Player erstellt. Beispiele mit Erklärungen gibts dazu genug, etwa Galileo Computing :: Java 7 - Mehr als eine Insel - 11 Netzwerkprogrammierung
Die Spieler speicherst du in einem Array und musst dann eben einen Algorithmus entwickeln, der die Spieler entsprechend zusammenführt. Ich kenne League of Legends nicht, aber laut diesem Wiki-Eintrag zum Matchmaking von LoL werden die Spieler wohl anhand ihrer Fähigkeiten zusammengeführt, sodass die Teams einigermaßen ausgeglichen sind und kein Anfänger gegen einen Vollprofi spielt.
Gerade bei größeren Sachen setzt man aus Performancegründen bei so was aber eher nicht auf Java. Was dabei rauskommt wenn man es doch tut sieht man ja z.B. bei Minecraft, das frisst Ressourcen ohne Ende. Das dürfte bei dir aber erst mal wohl keine große Rolle spielen, zumal du deinem Beitrag nach noch ziemlich am Anfang stehst. Da ist es erst mal wichtiger, das grundsätzliche Konzept zu verstehen und mal umgesetzt zu haben. Und wenn du ein erfolgreiches Spielkonzept entwickeln solltest ist das am Ende sowieso zweitrangig, siehe Minecraft


----------

