Ich plane derzeit ein Kartenspielprojekt, bei dem die Clients über Nachrichten, die über Sockets gesendet werden, rundenbasiert und synchron mit dem Server kommunizieren. Das Problem, das ich habe, ist, wie ich mit dem folgenden Szenario umgehen soll:
(Der Client ist an der Reihe und sendet seine Aktion an den Server.)
Der Client sendet eine Nachricht, in der er dem Server seinen Zug für den Zug mitteilt (z. B. spielt er die Karte 5 aus seiner Hand, die auf den Tisch gelegt werden muss).
Der Server empfängt Nachrichten und aktualisiert den Spielstatus (der Server hält den gesamten Spielstatus).
Der Server durchläuft eine Liste der verbundenen Clients und sendet eine Nachricht, um sie über Statusänderungen zu informieren
Alle Clients werden aktualisiert, um den Status anzuzeigen
Dies alles basiert auf der Verwendung von TCP, und wenn man es jetzt betrachtet, scheint es ein bisschen wie das Observer-Muster zu sein. Der Grund, warum dies für mich ein Problem zu sein scheint, ist, dass diese Nachricht nicht wie die anderen Punkt-zu-Punkt-Nachrichten zu sein scheint, da ich sie an alle Clients senden möchte, und dass das Senden derselben Nachricht nicht sehr effizient ist dieser Weg.
Ich habe darüber nachgedacht, Multicasting mit UDP zu verwenden, da ich dann die Nachricht an alle Clients senden könnte. Würde dies jedoch nicht bedeuten, dass die Clients theoretisch in der Lage wären, sich gegenseitig Nachrichten zu senden? Es gibt natürlich auch den synchronen Aspekt, obwohl dies, denke ich, über das UDP gestellt werden könnte.
Grundsätzlich würde ich gerne wissen, was eine gute Praxis wäre, da es bei diesem Projekt wirklich nur ums Lernen geht, und obwohl es nicht groß genug ist, um auf Leistungsprobleme zu stoßen, möchte ich sie trotzdem in Betracht ziehen.
Bitte beachten Sie jedoch, dass ich nicht daran interessiert bin, nachrichtenorientierte Middleware als Lösung zu verwenden (ich habe Erfahrung mit der Verwendung von MOM und bin daran interessiert, andere Optionen außer MOM in Betracht zu ziehen, wenn TCP-Sockets eine schlechte Idee sind!).
Selbst viele große, beliebte MMOs verwenden ausschließlich TCP. Es wird alles tun, was Sie brauchen, mit allen Effizienzmerkmalen, die Sie benötigen.
UDP erfordert viel zusätzliche Komplexität, Multicast erfordert noch mehr Komplexität, und Sie werden nichts daraus machen. Wenn Sie nur am Lernen interessiert sind, stellen Sie auf jeden Fall eine Tech-Demo für sich selbst zusammen, aber denken Sie nicht, dass das Projekt selbst in irgendeiner Weise besser dran sein wird.
Wenn Sie überhaupt an UDP interessiert sind, besteht Ihre allererste Aufgabe darin, TCP zusätzlich zu UDP neu zu implementieren, um sicherzustellen, dass Sie tatsächlich verstehen, wie Sie mit allen Problemen umgehen, die TCP für Sie löst: Überlastung Kontrolle, erneute Übertragung verlorener Pakete, verzögerte doppelte Verarbeitung, Paketbestellung, zuverlässiger Handshake der Verbindung, zuverlässige Trennungssequenz usw.
Es ist nicht unbedingt schwierig, all diese Probleme zu lösen, aber es erfordert ein tiefes Verständnis der Vernetzung, des IP-Protokolls und der Art und Weise, wie diese Probleme gelöst werden.
Von dort aus beginnt der Spaß beim Aufbau der Bibliothek, um Funktionen anzubieten, die TCP fehlen. Verwenden eines über einen Paketstrom gemultiplexten Nachrichtenstroms, effizientere Überlastungskontrolle, Behandlung von Ratenbegrenzungen, Mehrkanäle, Kanalkonfiguration (ob der Kanal Nachrichten in der richtigen Reihenfolge erfordert oder nicht, ob verworfene Pakete zulässig sind usw.) usw.
Ich würde vorschlagen, dass Sie die folgende Artikelserie lesen. Es ist nicht perfekt und macht einige sehr fragwürdige Behauptungen (beginnend mit dem Unsinn "TCP niemals in Spielen verwenden"), aber seine technischen Details sind für neue Netzwerkprogrammierer hilfreich: http://gafferongames.com/networking-for-game- Programmierer / udp-vs-tcp /
quelle