Masterserver per PHP

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Masterserver per PHP

      Hallo Community!

      Ich habe schon von einigen den Wunsch gehört, eine Art Masterserver in ihr Multiplayerspiel integrieren zu können. Also eine zentrale Stelle, an der alle offenen Sessions eines Onlinespiels registriert werden, damit andere Spieler diese Liste abrufen können um einem Spiel beitreten zu können, ohne die IP des Hosts zu kennen. Denn zum einen kann es auf Dauer nerven, immer erst seine IP weitergeben zu müssen damit andere in sein Spiel eintreten können und zum anderen können auf diese Weise auch Leute miteinander spielen, die sich nicht mal direkt kennen müssen.

      Deshalb will ich an dieser Stelle einmal ein Tutorial für solch einen Masterserver bereitstellen. Vorneweg möchte ich anmerken, dass das hier erklärte Vorgehen auf PHP basiert und ein Masterserver oft besser durch ein Programm umzusetzen ist, welches auf dem Server arbeitet und über das auch alle Spiele direkt laufen. Allerdings haben die Wenigsten einen dafür fähigen Server zur Verfügung. Bei der Methode, die ich hier vorstellen will, arbeitet der Masterserver eher als Vermittler von IPs über den die Spiele also nicht direkt laufen.

      Das Ganze soll wie folgt funktionieren: Auf einem PHP-fähigen Webspace wird eine Liste mit allen Sessions in einer Datei gespeichert. Per Anfrage kann ein Spieler diese Liste Abrufen oder gar selber seine Session registrieren, die dann in die Liste auf dem Webspace aufgenommen wird und somit für andere sichtbar ist. Eine Session auf dem Webspace besteht immer aus der IP-Adresse des Hosts und zusätzlichen Informationen, wie z.B. Name der Session und maximale Anzahl an Spielern. Ein Spieler, der nun einer Session beitreten will, ruft einfach die Liste ab, sucht sich davon eine Session aus und das Spiel kann sich über die bekannte IP mit dem Host verbinden.

      Alle benötigten Dateien findest du unten im Dateianhang. Zum testen kannst du einfach mal die "example.gm6" starten. Im Programm kannst du mit den entsprechenden Tasten, die du rechts siehst, eine neue Session erstellen, die Liste manuelle neu laden, oder deine Session löschen. Die Liste wird auch automatisch alle 30 Sekunden neu geladen. Wenn du Glück hast verwendet jemand anders auch dieses example im Moment und du kannst seinen Eintrag und seine IP-Adresse in der Liste sehen.

      Um nun deinen Masterserver einzurichten musst du nur die Datei "server.php" auf deinen Webspace laden. Mehr Dateien sind nicht nötig, es wird lediglich noch eine "server.dat" Datei im gleichen Ordner erstellt um die Liste der Sessions zu speichern. In den Ordner deines Spiels musst du dann die "server.dll" legen, die für die Kommunikation mit dem Masterserver zuständig ist. Die Datei "server.gml" enthält alle Scripts für die DLL. Diese findest du auch in der Datei "example.gm6". In jedem Script findest du auch dessen Erklärung.

      Anhand des examples lässt sich das Vorgehen im GM schon gut erkennen. Dennoch hier eine kurze Anleitung was zu tun ist.

      Zu Spielbeginn solltest du folgendes aufrufen:

      GML-Quellcode

      1. server_init();
      2. server_set_url("blackspark.prism-network.de","/server-tut");

      Die Adresse zu deinem Server solltest du oben noch entsprechend ändern. Um die Liste mit den Sessions abzurufen brauchst du folgende Funktion:

      GML-Quellcode

      1. server_refresh();

      Die Funktion gibt zudem zurück, ob das Abrufen erfolgreich war. Je nach dem könntest du an dieser Stelle eine Meldung ausgeben. Wenn ein Spieler eine neue Session startet kannst du ihn wie folgt auf deinem Masterserver registrieren, damit sich andere mit ihm verbinden können:

      GML-Quellcode

      1. server_data_clear();
      2. server_data_add("info 1");
      3. ...
      4. server_data_add("info ...");
      5. server_submit();

      Mit server_data_add legst du also zusätzliche Informationen fest, die andere, die sich die Liste vom Masterserver holen, anzeigen können. Wie schon oben erwähnt ist es sinnvoll zumindest der Session einen Namen zu geben und diesen zu übertragen. Aber auch beliebige andere Daten können noch zusätzlich übertragen werden, je nachdem was für das Spiel noch wichtig ist. Beachte auch die Reihenfolge, in der du die Daten mit server_data_add hinzufügst. Zum Abrufen der Daten wird später eine Nummer benutzt wobei 0 für den ersten Wert steht. Beachte auch, dass alle Werte als Zeichenkette übergeben werden müssen. Falls du also eine Zahl übertragen willst musst du die Funktion string benutzen. Wie schon bei server_refresh gibt auch server_submit zurück, ob der Vorgang erfolgreich ausgeführt wurde und lädt die Liste neu. server_submit dient außerdem dem Ändern von Daten, falls du bereits auf dem Masterserver registriert bist.

      Beachte, dass in der "server.php" als Schutz eine Obergrenze für die Größe der zusätzlichen Daten existiert. Standardmäßig ist hier 1024 eingestellt. Du findest den Wert in Zeile 119. Jedoch sollte der Standardwert mehr als ausreichend sein, sodass du nur in sehr seltenen Fällen einen größeren Wert einstellen musst.

      Wie du an den Inhalt der abgerufenen Liste gelangst, findest du in den Erklärungen der entsprechenden Scripte und natürlich im example.

      Wenn ein Spieler seine Session beendet soll diese natürlich auch vom Masterserver gelöscht werden. Dazu gibt es folgende Funktion:

      GML-Quellcode

      1. server_remove();

      Auch diese Funktion gibt wieder zurück, ob der Vorgang erfolgreich war.
      Natürlich kann es passieren, dass ein Spiel mal abstürzt, oder auf andere Weise ungewöhnlich beendet wird. Damit das allerdings nicht zur Folge hat, dass obige Funktion nicht aufgerufen würde und die IP des Spielers für immer auf dem Masterserver verbleiben würde, gibt es ein sogenanntes Timeout. Wenn der Masterserver länger als dieses Timeout keine Rückmeldung vom Spieler per server_refresh oder server_submit erhält, wird er automatisch aus der Liste gelöscht. Deshalb sollte in regelmäßigen Abständen, kleiner als das Timeout eine der beiden Funktionen aufgerufen werden. Im example ist es das Alarm-Event, das diese Aufgabe durchführt. Mit folgender Funktion wird das Timeout in Sekunden festgelegt:

      GML-Quellcode

      1. server_set_timeout(...);

      Voreingestellt ist 60. Das Timeout wird beim nächsten Aufruf von server_submit übertragen und gilt auch nur für diese Session.
      In der "server.php" ist ein Maximum für das Timeout von einer Stunde festgelegt. In Zeile 121 kannst du es ändern.


      Das wars auch schon!
      Nun viel Spaß damit und ich hoffe ihr kommt zurecht. Bei Unklarheiten könnt ihr gerne Fragen!

      Gruß BlackSpark.
      Dateien
      • server.rar

        (49,81 kB, 541 mal heruntergeladen, zuletzt: )

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bl@ckSp@rk ()

    • Ich habe das Serversystem jetzt mal in mein Spiel eingaut und auf meinen Server angepasst, funktioniert wirklich sehr gut soweit ;) Eine Frage hätte ich dann aber noch, was ist wenn sich der GameMaker zum beispiel aufhängt, da wird die erstellte Session nicht gelöscht, da ja das GameEnd Event nicht ausgeführt wird oder?

      Entschuldigung für den Doppelpost
    • Das ist richtig. Für den Fall hab ich aber einen Mechanismus eingebaut: Siehe ersten Post:

      [...] Natürlich kann es passieren, dass ein Spiel mal abstürzt, oder auf andere Weise ungewöhnlich beendet wird. Damit das allerdings nicht zur Folge hat, dass obige Funktion nicht aufgerufen würde und die IP des Spielers für immer auf dem Masterserver verbleiben würde, gibt es ein sogenanntes Timeout. Wenn der Masterserver länger als dieses Timeout keine Rückmeldung vom Spieler per server_refresh oder server_submit erhält, wird er automatisch aus der Liste gelöscht. [...]
    • Klasse, find ich sehr gut, ich denke, dass schon viele Leute vom "IP-Übergeben" genervt waren, wie ich und ein Freund schon desöfteren.
      Sowas hätten einige Leute früher auch schonmal brauchen können. (Ich erinner mich an einige ältere Spiele die das bräuchten =D)
      So far, Schattenphoenix~
      _____________________________________________________________________________
      "Who needs a stairway to heaven...
      If there is an elevator to hell... ?
      "
      - Vergessen
      "Auch ein perfektes Chaos ist etwas vollkommenes."
      - Jean Genet
    • Wir haben es inzwischen auch erfolgreich in unser kleines Projekt integriert - komplikationslos! Kam in der Tat genau richtig, aber wir haben ja schon vor einiger Zeit drüber geredet. Danke nochmal an dieser Stelle, BlackSpark!
      █████ ██ █ ████ everything ███ █████ is █████ ████ ████ fine ████ ███ █ ██████ love.
      █████ ███████ ███ your █████ ████ government.
    • Doch immer ^^
      Ich konnts noch nich benutzen, werd es mir aba raussuchen, wenn ich mich an irgendwas Online-Artiges setze ^^
      So far, Schattenphoenix~
      _____________________________________________________________________________
      "Who needs a stairway to heaven...
      If there is an elevator to hell... ?
      "
      - Vergessen
      "Auch ein perfektes Chaos ist etwas vollkommenes."
      - Jean Genet
    • Also entweder bin ich zu doof oder keine ahnunge was...

      also bei mir kommt immer der fehler "Eintragung/ Aktualisierung/ Löschen fehlgeschlagen".

      Kann mir vlt wer helfen...

      Edit:

      Arg okay habs schon ^^
      Schreibfehler wa schuld, tschuldigung.

      Im nachhinein wa es wirklich super einfach xD sehr nice ^^

      Aber trotzdem noch 2 Fragen:

      1. Angenommen ich hab nun nen Server erstellt und jemand anderes soll drauf zu greifen, da muss ich ja die Ports freigeben, right?
      So meine Firewall zeigt mir bei dem Example nun an
      "port:80
      und source port:1346"

      muss ich beide freigeben? ^^

      2. man könnte doch auch so gesehen auf dieser basis ein "Wer ist online" Script schreiben, richtig?
      Da ja jeder seine IP schickt und die Liste immer aktualisiert wird.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Electrodragon ()

    • Zu 1. Also Port 80 ist der HTTP Port, den musst du freigeben, ansonsten wird nichts an den Masterserver geschickt. Der andere Port ist dann für die Serverkommunikation da(nicht sicher).
      In meiner psychisch soziologischen Konstellation, manifestiert sich die absolute Dominanz positiver Impressionen meines Individuums.
      Kurz: Ich bin geil!

    • Danke.

      1. Nein, du brauchst keine Ports freigeben. Die DLL braucht keine anderen als z.B. auch der Browser, da die Verbindung per http geschieht und dafür standardmäßig Port 80 verwendet wird. Zudem möchte ich anmerken, dass das Spielgeschehen an sich natürlich nicht über den Server läuft. Dieser ist lediglich dazu da, IPs der Clients zu vermitteln.

      2. Ja, könnte man.
    • Nochmals vielen Dank für die DLL und das Tutorial ist wirklich sehr einfach und verständlich.
      Einfach ein Muss für jedes Online Game.

      Wäre schön, wenn du die DLL auch auf deiner Page hochstellst, damit ich mich das nächste mal nicht totsuchen muss ^^

      -Speedy
    • Danke für das Lob!

      Wollte es nicht auf meine HP stellen, weil eben zur DLL noch das Tutorial dazu gehört. Wenn dann müsste ich dem Download schon eine Anleitung beilegen, damit es von meiner HP unabhängig vom Forum hier zu gebrauchen ist und darauf hatte ich eigentlich keine Lust. Ich finde es reicht hier. Nebenbei habe ich auch generell keine Tutorials auf meiner HP. Finde sowas hier im Forum einfach passender.
    • Um es nochmal zu betonen: Das System ist nur dazu da, um IP-Adressen unter den Spielern auszutauschen. Im Grunde musst du ein Netzwerkspiel erstellen, das ganz normal über TCP/IP läuft. D.h. alles was das Spiel angeht, die Kommunikation unter den Spielern, bleibt trotzdem deine Aufgabe. Der einzige Punkt, wo dir das System unter die Arme greifen soll, ist dass die Spieler keine IP-Adressen angeben müssen, da das Spiel die IP-Adressen von anderen Spielern ermitteln kann, die schon ein Spiel aufgemacht haben und auf Mitspieler warten.

      Es funktioniert also so: Ein Spieler eröffnet einen "Raum", wartet auf Spieler und sagt dem Masterserver "Ich warte auf Spieler. Vermittle mich weiter!" (server_submit). Ein anderer Spieler möchte einem Spiel beitreten, lädt die Liste vom Masterserver (server_refresh) und findet darin den Eintrag des ersten Spielers zusammen mit dessen IP (und anderen Infos). Nun kann sich der Spieler über diese IP mit dem ersten Spieler verbinden und beide sind glücklich ;)
    • Alles klar danke! ;)
      Hoffe, dass ich es hinbekomme.
      Werde mich dann heute Abend nochmal damit beschäftigen...
      Kurz noch eine Frage:
      Kann ich das am selben PC testen, indem ich zwei mal das Spiel öffne?
      Falls nicht, kann ich es an einem zweiten PC testen, der aber über WLan mit dem selben Router verbunden ist?