Terandox: Variablen auf mehreren Pcs verwenden

Guten Tag alle zusammen,

Ich bin gerade dabei ein Brettspiel in JavaScript zu programmieren und habe ein Problem.

Ich würde dem Spiel gerne einen Online Modus hinzufügen, kenne mich aber überhaupt nicht mit SQL und PHP aus, und würde gerne die Variablen, die während des Spiels verändert werden, auf allen PC's parallel ändern.

Wenn mir jemand helfen könnte würde ich mich sehr freuen.

Mit freundlichen Grüßen,

Euer Terandox

  1. Tach!

    Ich würde dem Spiel gerne einen Online Modus hinzufügen, kenne mich aber überhaupt nicht mit SQL und PHP aus, und würde gerne die Variablen, die während des Spiels verändert werden, auf allen PC's parallel ändern.

    Dazu brauchst du einen serverseitigen Synchronisationsmechanismus. Immer wenn ein Client einen Wert ändert, muss der zum Server und von dort aus zu den anderen Clients gesendet werden. Dazu braucht es einen Mechanismus, dass der Server von sich aus Nachrichten senden kann und die Clients nicht ständig pullen müssen. WebSocket ist eine Möglichkeit, aber das ist auch etwas komplexer einzurichten als nur ein PHP-Script auf den Server zu stellen.

    dedlfix.

  2. Hallo Terandox,

    Variablen auf mehreren Systemen "gleichzeitig ändern" geht nicht.

    Spätestens wenn Du den Arbeitsspeicher eines Gerätes verlässt (meistens auch schon früher) musst Du auf den Versand von Nachrichtenpakten zurückgreifen. In diesem Moment ist bereits das "gleichzeitig" vorbei, weil die Änderungsmeldung von Gerät A ja erstmal auf die Geräte B,C,D,... transportiert werden muss.

    Um die ärgsten Synchronisationsprobleme zu vermeiden, verwendet man daher eine zentrale Instanz, die den Spielstand festhält. Jeder, der etwas am Spielstand ändern will, sendet eine Änderungsmitteilung an die zentrale Instanz. Diese aktualisiert den globalen Spielstand und verteilt an alle angeschlossenen Spieler die neue Situation. Das kann bei kleinen Spielen eine Komplettmeldung sein, das kann aber zu aufwändig werden, und man schickt nur Mitteilungen über das, was sich ändert.

    Ganz wichtig ist, dass kein Client seinen eigenen Spielstand ändern darf. Jede Änderung muss als Nachricht zum Server laufen, wird dort verarbeitet und die Folgen dieser Änderung gehen an die Stationen.

    Du hast also zwei Aufgaben zu lösen: (1) Programmieren dieser zentralen Instanz (Spielserver) und (2) Erstellen einer bidirektionalen Kommunikation zwischen Server und Clients.

    Wenn Du keine Ahnung von SQL und PHP hast, dann guck Dir Node.js an. Der simple Webhoster mit PHP eignet sich ohnehin nicht gut für bidirektionale Kommunikation, da muss man sehr krumme Bocksprünge machen. Problem: Node.js ist eine aktive Komponente (da läuft ständig ein Script), keine reaktive Komponente (die nur auf externe Zugriffe antwortet), deshalb ist das in Billigangeboten nicht drin.

    Node.js ist die JavaScript-Engine von Google, die auch in Chrome enthalten ist, aber nicht für's DOM, sondern für den Serverbetrieb. Das ist immer noch eine Lernkurve, aber wenn Du JS schon kannst, ist das vielleicht einfacher. Und du musst den Spielstand nicht in einer DB speichern, sondern kannst ihn im RAM behalten. Wenn ein Server mehrere Spieltische hosten können soll, musst Du natürlich darauf achten, dass sich das nicht vermischt. Eine DB brauchst Du nur, wenn Du bei einem Serverneustart (absichtlich oder wegen Crash) die laufenden Spiele nicht verlieren willst - aber man KANN es auch so lösen, dass man jede Änderung in einer Datei protokolliert und bei einem Neustart den Spielstand auf Grund der protokollierten Änderungen wiederherstellt. Ist der Spielstand nicht zu groß, kann man ihn auch einfach nach jeder Änderung als Komplettdatei raushauen.

    Node.js unterstützt, da es eine aktive Komponente ist, Websockets. Das ist State-of-the-Art für bidirektionale Kommunikation. Die programmierst Du nicht selbst an, das ist sehr mühsam, sondern verwendest ein JS Framework dafür. Ich wollte das selbst man anfangen, hatte aber keine Zeit - ich war nur bis zur Auswahl des Frameworks gekommen. Ich hätte socket.io verwendet. Einen Apache kann man dann immer noch daneben stellen, um die statischen Inhalte (HTML, CSS, JS, Grafiken) zu liefern, man muss dann nur auf Same Origin Policy aufpassen.

    Wenn Du C# oder VB.net kannst, könntest Du auch an einen ASP.NET Server denken. Neuere Version von .net können Websockets, bei älteren gibt es die Alternative SignalR. Du solltest Dich dann aber mit dem .net Framework oder .net Core Ökosystem auskennen.

    Also - alles nicht so einfach. Du könntest Dir auch mal die Board Game Arena anschauen. Dafür musst Du allerdings PHP und SQL können. Die haben ein Framework, dass Dir das meiste bereits abnimmt. Wenn dein Brettspiel selbst erfunden ist, hast Du keine Copyrightprobleme. Ist es bekannt, gibt es drei Möglichkeiten: der Hersteller gibt keine Lizenz, sie warten auf einen der es baut, oder es ist schon da.

    Rolf

    --
    sumpsi - posui - clusi
    1. Tach!

      Wenn Du C# oder VB.net kannst, könntest Du auch an einen ASP.NET Server denken. Neuere Version von .net können Websockets, bei älteren gibt es die Alternative SignalR.

      SignalR ist keine Alternative, sondern ein Aufsatz, der sowohl WebSockets als auch Forever Frame und Polling zur Kommunikation nutzen kann. Wichtiger ist aber, dass man damit auf einer höheren Ebene arbeitet als mit einem nackten WebSocket.

      dedlfix.

    2. Eine DB brauchst Du nur, wenn Du bei einem Serverneustart (absichtlich oder wegen Crash) die laufenden Spiele nicht verlieren willst - aber man KANN es auch so lösen, dass man jede Änderung in einer Datei protokolliert und bei einem Neustart den Spielstand auf Grund der protokollierten Änderungen wiederherstellt. Ist der Spielstand nicht zu groß, kann man ihn auch einfach nach jeder Änderung als Komplettdatei raushauen.

      Ist es dann nicht auch möglich, die Variablen auf einer Datei zu ändern, und dann zu beginn jedes Zuges die aktuellen Werte abzufragen?

      So würde ich mir doch eine Menge Programmierarbeit sparen, oder?

      1. Tach!

        Ist es dann nicht auch möglich, die Variablen auf einer Datei zu ändern, und dann zu beginn jedes Zuges die aktuellen Werte abzufragen?

        Ja, im Prinzip schon.

        So würde ich mir doch eine Menge Programmierarbeit sparen, oder?

        Nein, nicht wesentlich. Wenn du eine Datei statt einem DBMS nimmst, musst du die Zugriffe auf diese Datei selbst gegen Mehrfachzugriff absichern. Du musst die Datei für weitere Zugriffe sperren, bevor ein Prozess in sie schreibt. Es ist einfacher, ein DBMS zu verwenden, und sei es nur SQLite. Die haben dieses Problem des Lockings auf Dateiebene schon gelöst.

        Konkurrierende Zugriffe gibt es aber auch in der Schicht, in der die Daten im Sinne der Geschäftslogik geändert werden. Lesen→Ändern→Schreiben muss ein atomarer Prozess sein, in den kein anderer dazwischenfunkt. Oder es muss sichergestellt sein, dass die Daten dieselben sind, die man gelesen hat und nicht von einem anderen Prozess mittlerweile geändert wurden.

        dedlfix.

  3. Hallo Terandox,

    und würde gerne die Variablen, die während des Spiels verändert werden, auf allen PC's parallel ändern.

    Ich verstehe das so: Du hast n (unbestimmt viele) Spieler weltweit, also nicht in deinem Local Area Net?

    Wenn einer eine Aktivität ausführt, sollen das alle anderen sehen.

    Die Spieler rufen zwar dieselbe Webseite vom Server ab, sollen dann aber nur mit Hilfe ihres (durchaus unterschiedlichen) Browsers und Javascript den Spielvorgang beeinflussen?

    Javascript kann zwar per Ajax Daten beliebig oft herunterladen (Zugriff mit setTimeout), aber ich sehe keine Chance, Daten hochzuladen. Da müsste auf dem Server ein Programm laufen, das die Daten empfängt und für das Herunterladen bereitstellt.

    1. Hallo,

      und würde gerne die Variablen, die während des Spiels verändert werden, auf allen PC's parallel ändern.

      Ich verstehe das so: Du hast n (unbestimmt viele) Spieler weltweit, also nicht in deinem Local Area Net?

      vermutlich ja - wobei "in deinem Local Area Net" eine Teilmenge von "weltweit" sein kann, das wäre egal.

      Javascript kann zwar per Ajax Daten beliebig oft herunterladen (Zugriff mit setTimeout), aber ich sehe keine Chance, Daten hochzuladen.

      Nein??

      Da müsste auf dem Server ein Programm laufen, das die Daten empfängt und für das Herunterladen bereitstellt.

      Das existiert schon. Es wird verallgemeinert als Webserver bezeichnet.
      Im Ernst: Man kann Spielzüge (Statusänderungen) jederzeit mit einem POST-Request an den Server übermitteln, theoretisch sogar mit einem GET-Request (nicht empfehlenswert). Solange die anderen Teilnehmer regelmäßig den aktuellen Spielstand abfragen und lokal aktualisieren, könnte das funktionieren. Nur effizient wäre es nicht - wegen der vielen zyklischen "ergebnislosen" Abfragen.

      Ciao,
       Martin

      --
      Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
      1. Hallo Martin,

        ich denke, Linuchs meinte „Datei stumpf hochladen ohne dass da ein Serverscript läuft“. Aber dafür gibt's sicherlich fertige Scripte.

        Wichtig ist dabei ein Authentication Konzept und die Sorge dafür, dass die Spieltische nicht vermengt werden, wenn mehr als ein Spiel gleichzeitig läuft.

        Trotzdem: Das ist nicht das Gelbe vom Ei. Eine aktive Serverkomponente ist definitiv besser.

        Rolf

        --
        sumpsi - posui - clusi