ich habe in C++ mit SDL (im Rahmen einer Isometrischen RPG Engine) etwas experimentiert. Allerdings frage ich mich, wie man am OOP-artigsten Netzwerkkommunikation betreibt. Ausgehend vom Server-Client-Konzept verwende ich derzeit folgende Herangehensweise:
Auf dem Server gibt es einen ListenerThread, der ankommende Clients annimmt und für diesen einen HandlerThread startet. Für jeden angenommenen Client gibt es einen HandlerThread, der der Kommunikation zwischen Client und Server dient.
Die Clients senden z.B. die gewünschten Positionsänderungen (Objekt-ID, Richtungs-ID) an den Server. Dort wird dann die Bewegung geprüft (Kollision etc.) und ausgeführt. Anschließend wird die neue Position (Objekt-ID, Position XY) an alle Clients gesendet. Diese (und somit auch der ursprüngliche Absender) aktualisieren die Position des jeweiligen Objekts (in ihrer View).
Dabei erscheinen mir ein paar Dinge nicht so OOP-artig (sehen für mich auch irgendwie unschön aus):
(1) Threading: Beim starten der Threads kann ich nur einen Parameter angeben. Wenn ich als Thread-Funktion die Methode der Server-Instanz (ausgehend davon, dass es eine Klasse Server gibt, die das handlet) verwende, geht der eine Parameter ja schon für das Mitgeben der Server-Instanz drauf. Für weitere Parameter ist dann kein Platz. Derzeit fahre ich eine Alternative: Ein Struct, das die Server-Instanz und weiteren Parameter enthält. So richtig schön ist das aber auch nicht. Zumal ich für unterschiedliche Parameter dann wieder unterschiedliche Struct's brauche :-S
(2) Kommunikation: Für die Kommunikation sende ich über den Socket erst eine Aktions-ID (die Server und Client kennen) und anschließend alle Daten (alle int's, string's usw. einzeln). Der Server "switcht" die Aktions-ID, führt die entsprechende Methode aus und gibt ihr als Parameter den Socket mit). Dann liest die Methode die weiteren Daten vom Socket, verarbeitet sie und startet anschließend die Benachrichtigung aller Clients.
Nun:
- Bei (2) ist das wahrscheinlich die gängigste Variante. Oder?
- Bei (1) habe ich Bauchschmerzen: Mit der Zeit entsteht ein schwer überschaubares Gewirr an Struct's, kryptischen Thread-Aufrufen und schlecht überschaubarer Verfolgung der Arbeitsweise. Allerdings finde ich keinen "schöneren" Ansatz für den Umgang mit Threads (btw basierend auf den SDL-Threads) aus objektorientierter Sicht :-S
LG Glocke