![]() |
|
|
|||||||
| Netzwerkprogrammierung Fragen zu Client-/Server-Programmierung sowie zu verteilten Anwendungen (RMI, CORBA etc.) |
|
|
|
Themen-Optionen | Thema durchsuchen | Ansicht |
| #1 (permalink) | |
|
Benutzer
Byte
Registriert seit: 06.08.2007
Beiträge: 97
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
|
Hallo,
Ich plane momentan an einem Netzwerk-basierten Spiel, ähnlich wie Schach. In diesem Spiel gibt es mehrere Phasen: Einheiten kaufen, Einheiten platzieren und das eigentliche abwechselnde Ziehen der Figuren. Meine Idee war es jetzt, dass ein Spieler ein Spiel erstellt und sich ein weiterer Spieler in das Spiel einklinkt. Der erste Spieler fungiert somit als Client und Server zugleich, wobei hier kein Unterschied zu einem normalen Client gemacht werden soll. Die Clients sollen nun nur die nötigsten Informationen an den Server senden (Spielzüge), dieser berechnet dann den nächsten Schritt und sendet die Änderungen an alle Clients. Ich denke das ist soweit ganz sinnvoll. Nun habe ich allerdings ein kleines Strukturierungsproblem. Es gibt nun, aufgrund der unterschiedlichen Phasen eine Menge Funktionen, die das Server-Interface bereitstellen muss. Ich will jetzt dem Interface nicht einfach alle möglichen Funktionen unterschieben. Ich habe vor, den Server wie eine State Machine laufen zu lassen. Sprich es gibt für jede Phase einen Zustand. Nun Frage ich mich, wie ich da für die unterschiedlichen Phasen am besten Struktur hineinbringen kann. Soll ich für jede Phase ein eigenes Interface schreiben? Der Server hätte dann trotzdem alle diese Funktionen, die nicht alle etwas miteinander zu tun haben, zu implementieren. Gibt es für solche Probleme, eine elegante Lösung? Gruß, Pfaeff |
|
|
|
| #2 (permalink) | |
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 18.11.2004
Beiträge: 4.571
Abgegebene Danke: 6
Erhielt 42 Danke für 42 Beiträge
|
Also prinzipiell macht es natürlich schon Sinn Methoden logisch zu gruppieren und in einzelne Interfaces zu packen (die dann natürlich irgendwo [Server] implementiert werden müssen).
Aber in wieweit es Sinn macht einen Serverzustand auf ein Interface (oder umgekehrt) abzubilden: Kein Plan. Ich würde es wohl nicht tun. Aber das kommt auf den einzelfall an. Und nur um es erwähnt zu haben: Das ist ein allgemeines "Designproblem" und nicht SIMONspezifisch ![]() Gruß Alex
__________________
SIMON, das einfach bessere RMI ... -> Projektseite -> Warum SIMON besser ist als RMI -> Support-Forum |
|
|
|
| #3 (permalink) | |
|
Benutzer
Byte
Themenstarter
Registriert seit: 06.08.2007
Beiträge: 97
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
|
Ja ich weiß, dass es ein relativ allgemeines Problem ist, es tauchte bei mir aber im Zusammenhang mit Simon und Interfaces auf
Bei RMI wäre es ja auch nicht anders.Wenn ichs nicht besser strukturiert bekomme, dann muss ich irgendwie für mehr Abstraktion sorgen. So wie es jetzt geplant ist, wird es von jeder Methode, die fürs Netzwerk relevant ist, drei Sorten geben. Nennen wir sie mal wie folgt: Der Benutzer "sorgt" also für den Aufruf von fooUserInteract(). Diese Methode ruft dann fooServer() auf dem Server auf. Dieser berechnet den nächsten Zustand und ruft wiederum fooClient() als Callback auf. Ich hätte also eine Methode auf der Ebene der Interaktion, eine auf der die relevanten Berechnungen für das Spiel stattfinden und eine bei der das Ergebnis dem Client angezeigt wird. Ist das soweit sinnvoll? Ich hätte dann halt zwei Interfaces (Client und Server) voller Funktionen, die fast gleichnamig wären. Die Datenstruktur auf der beide operieren soll identisch sein. Der Client hat praktisch nur eine Kopie von dem was auf dem Server lagert und bekommt immer mit, wenn sich etwas ändert. Ich würde mir auch gerne mal anschauen, wie andere so etwas realisiert haben, gibt es irgendwo Beispiel-Sources in der Richtung? Geändert von Pfaeff (10.03.2010 um 09:19 Uhr) |
|
|
|
| #4 (permalink) | |
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 18.11.2004
Beiträge: 4.571
Abgegebene Danke: 6
Erhielt 42 Danke für 42 Beiträge
|
Wie wär's denn mit dem definieren der guten alte Use-Cases...
Fangen wir doch also mal von vorne an: Was macht denn der Client alles? Ist das Spiel wirklich "rundenbasiert"? Gibt es einen geregelten Ablauf? Bisher konnte ich aus deiner Beschreibung lesen: 1) Einheiten kaufen 2) Einheiten platzieren 3) und das eigentliche abwechselnde Ziehen der Figuren Sofern 2 und 3 wirklich unterschiedliche Dinge sind, und alle 3 in dieser Reihenfolge ablaufen sollen, würde ich dafür 3 Interfaces anlegen und im Server abverfolgen welche Schritte/Abläufe schon erledigt sind. Sofern der Schritt "einheiten kaufen" nicht nicht vom Client abgehandelt wurde, und dieser dann quasi vorzeitig Einheiten platzieren wollte, würde der Server bei diesem Versuch eine Exception von wegen "IllegalStateException" oder so werfen. Die ganze Ablauflogik sollte also im Server vorhanden sein (allein schon deswegen damit keiner bescheißen kann). - Alex
__________________
SIMON, das einfach bessere RMI ... -> Projektseite -> Warum SIMON besser ist als RMI -> Support-Forum |
|
|
|
| Danke sagt: |
Pfaeff (10.03.2010)
|
| #5 (permalink) | |
|
Benutzer
Byte
Themenstarter
Registriert seit: 06.08.2007
Beiträge: 97
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
|
Ja, genauso meinte ich das in meinem Ursprungspost. Für jede Phase des Spiels praktisch ein Interface und wenn der Client auf ein Interface zu greift, welches außerhalb des jetzigen "States" des Servers liegt, lehnt dieser dann ab.
Use-Case-Diagramm hab ich vor mir liegen (wenn auch nicht in UML-Standard) .
|
|
|
|
| #6 (permalink) | |
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 18.11.2004
Beiträge: 4.571
Abgegebene Danke: 6
Erhielt 42 Danke für 42 Beiträge
|
Okay, dann versteh ich nur noch nicht was du mit den vielen Methoden hast?
Viele Methoden sind erstmal nicht schlimm. Schlimm ists wenn du nur ein Objekt das das alle Methoden enthält und alle Methoden thematisch wild durcheinander wuchern. Würde in jedes Interface dann noch ne Methode packen mit der der Client signalisieren kann "ich hab Phase 1 jetzt abgeschlossen und werde mit Phase 2 weiter machen". Damit kann der Server dann den State für diesen Client entsprechend anpassen. - Alex
__________________
SIMON, das einfach bessere RMI ... -> Projektseite -> Warum SIMON besser ist als RMI -> Support-Forum |
|
|
|
| #7 (permalink) | |
|
Benutzer
Byte
Themenstarter
Registriert seit: 06.08.2007
Beiträge: 97
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
|
Genau das wäre nämlich passiert, wenn ich nur ein Interface gehabt hätte. Dann wären dort nämlich allerlei unterschiedliche Methoden drin gelandet, die thematisch nichts mit einander zu tun haben. Aber jetzt ist alles klar, danke
|
|
|
|
| #8 (permalink) | |
|
Stammbenutzer
Kilobyte
Registriert seit: 01.11.2008
Beiträge: 520
Abgegebene Danke: 1
Erhielt 16 Danke für 16 Beiträge
|
Ich weiß nicht ob simon das so macht, aber ihs chicke bei meinem simplen Netzwerksystem Objecte die von Message erben.
Mein ansatz wäre jetzt 3 Statemessages zu erstellen, also eine BuyPhaseMessage;PlacePhaseMessage,PlayPhaseMessage. Beim server werden dann 3 messageevent listener hinzugefügt, die jeweils als erste zeile enthalten if(bla.Phase == "Buy" && recivedmessage instanceof BuyMessage). sprich cih würde das ganze klassenbasiert Lösen. Zudem ist Simon schon leichter overkill für Schach ^^ einfach nen Socket mit nem Object Output/Input Stream dran sollte in diesem Fall tatsächlich einfacher zu implementieren sein. |
|
|
|
| #9 (permalink) | |
|
Stammbenutzer
Viertel Gigabyte
Registriert seit: 18.11.2004
Beiträge: 4.571
Abgegebene Danke: 6
Erhielt 42 Danke für 42 Beiträge
|
@Empire
Naja. Objekte und Spiellogik muss man so oder so erstellen. Da noch SIMON mit rein zu basteln ist 5min Arbeit. Mehr nicht. Selbst auf den Sockets rumzuwerkeln dauert defintiv länger. Als Overkill kann man maximal das hinzufügen der benötigten Libs bezeichnen. Aber im Endeffekt ist es eine einzige Library die man in den Classpath mit aufnehmen muss. Wer das nicht will kann ja immer noch auf RMI zurückgreifen. Der "Aufwand" ist der gleiche. Aber man muss keine Lib hinzunehmen (hat dann aber das Callback-Problem). Intern werden bei SIMON keine "Transportobjekte" für Nachrichten erstellt und serialisiert. Die kommunikation basiert auf Rohdaten. Nur Methodenargumente und evtl. Rückgabewerte werden extra mit der javatypischen Serialisierung in byte[]s gewandelt.
__________________
SIMON, das einfach bessere RMI ... -> Projektseite -> Warum SIMON besser ist als RMI -> Support-Forum |
|
|
|
| #10 (permalink) | |
|
Java-Forum Team
IRC-Operator (Java-Chat)
Moderator Registriert seit: 17.08.2007
Beiträge: 3.954
Abgegebene Danke: 2
Erhielt 153 Danke für 149 Beiträge
|
Nur kurz als Einwurf:
SIMON ist eine tolle Sache (tuxedo du weiß wie ich das Ding mag *gg*) aber man sollte sich an gewissen Punkten überlegen, ob es sinnvoller ist eine Art TransportObjects zu nutzen um einen großen Haufen Daten auf einmal zum Client zu übertragen (z.B. Positionsdaten oder Gegnerdaten). Dies ist bei SIMON Trafficlastiger (wenn auch nur minimal) und Zeitkostenintensiver, da jeder Methodenaufruf gegen das Interface gesondert zum Server übermittelt wird. Hier sollte man an gewissen Punkten ein TO als Rückgabe für eine Methode in Betracht ziehen.
__________________
Lycia: Lycia (formerly known as Java XmlParser) is an event-based parser framework for being used on top of different structured datasources such as XML http://code.google.com/p/lycia/ |
|
|
|
| #11 (permalink) | |
|
Benutzer
Byte
Themenstarter
Registriert seit: 06.08.2007
Beiträge: 97
Abgegebene Danke: 8
Erhielt 1 Danke für 1 Beitrag
|
Das würde ja aber nur bei einem Echtzeitsystem ein Problem darstellen. Da es sich hier um ein Runden-basiertes Spiel handelt, spielt die Zeit und der Traffic-Overhead nicht wirklich eine Rolle.
Wäre es nicht auch möglich, statt jeder Menge Methoden eine Referenz auf das Objekt (also zum Beispiel das Schachbrett) zu übergeben, sodass wenn der Client etwas am Objekt ändert, dies dann auch automatisch an den Server und alle Clients weitergeleitet wird. Wird dann nur die Änderung übertragen oder sämtliche Daten des Objektes? Geändert von Pfaeff (14.03.2010 um 12:42 Uhr) |
|
|
|
| #12 (permalink) | |
|
Java-Forum Team
IRC-Operator (Java-Chat)
Moderator Registriert seit: 17.08.2007
Beiträge: 3.954
Abgegebene Danke: 2
Erhielt 153 Danke für 149 Beiträge
|
Ja ok, dann ist das kein Problem
__________________
Lycia: Lycia (formerly known as Java XmlParser) is an event-based parser framework for being used on top of different structured datasources such as XML http://code.google.com/p/lycia/ |
|
|
|
|
| Lesezeichen |
Latex Maths & Physics Editor ...
|
| Themen-Optionen | Thema durchsuchen |
| Ansicht | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| class, interface, or enum expected | JaLin | Java Basics - Anfänger-Themen | 4 | 13.05.2010 14:48 |
| Interfaces | hdi | Entwürfe | 10 | 10.06.2009 09:34 |
| SIMON 0.3, featured by Apache MINA | tuxedo | Codeschnipsel u. Projekte | 11 | 12.02.2009 13:29 |
| Thinking in Java: Kap.8, Üb.12: Interface, inner Class | na-oma | Java Basics - Anfänger-Themen | 0 | 13.09.2005 17:04 |