Ergebnis 1 bis 4 von 4

Thema: [Tutorial]Eigenes Server-Control-System I

  1. #1
    Erfahrener Benutzer
    Registriert
    27.06.2010
    Beiträge
    136
    TrackMania
    ๓яł¤ł
    Login: joshua-g United
    Nickname: ๓яł¤ł
    Zone: World » Germany » Hamburg
    Multiplayer: 96.856 (60.487 LP)
    Soloplayer: 10.958 (57.489 SP)
    ManiaLinks: speedtech
    Links: TM-Ladder

    Glühbirne [Tutorial]Eigenes Server-Control-System I

    Eigenes Server-Control-System I
    Eine Einführung in die Netzwerk-Programmierung

    Kapitel:
    1. - Vorwort
    2. - Aller Anfang ist schwer
    3. - Hier bin ich!
    4. - Hey, ich will etwas wissen!
    5. - Bla, bla, bla
    6. - Tick, Tack
    7. - Links


    - Vorwort -
    Hallo und herzlich Willkommen zu meinem kleinen Tutorial, wie man ein "Xaseco like"-Server-Control-System erstellt. Als ich angefangen hab, dachte ich: "Einfach mal in die "aseco.php" reinschauen. Da findet man bestimmt etwas." Mh, nun ja, das tat ich auch, nur hab ich kein Wort verstanden. Erstmal war ich erstaunt, dass es über 2300 Zeilen waren^^. Nur zur Info: So viel werden wir in diesem Tutorial nicht behandeln^^. In diesem Tutorial werde ich erklären, wie man eine Verbindung mit dem Dedicated Server von Nadeo herstellt, Infos ausgibt, Texte im Chat ausgibt und Manialinks darstellt.
    Nun werde ich jetzt nicht gleich den SanXMars darstellen lassen, sondern nur eine einfache Uhr. Aber immerhin^^. Ich habe diese Uhr übrigens von Marco01_809. Mit ihm habe ich auch Servercoding angefangen.

    - Aller Anfang ist schwer -
    Ich fange mal damit an, was man braucht:
    1. -Dedicated Server
    2. -Evtl. Notepad++
    3. -Gute Kenntnisse in PHP (Klassen, Funktionen)
    4. -PHP installiert


    Notepad++ ist nicht zwingend notwendig, aber wer scriptet, kennt diesen Programm. Die Kenntnisse in PHP braucht man, da alles in PHP geschrieben wird.

    - Hier bin ich! -
    In diesem Kapitel zeige ich euch, wie man anfängt und eine Verbindung zum Server herstellt.
    Als erstes erstellen wir eine neue Textdatei, nennen diese control.txt und ändern die Endung in .bat.
    Nun öffnen wir diese Datei in Notepad++ und schreiben:
    @echo off

    rem ****** Hier PHP-Patch einfügen *******

    set INSTPHP=C:\Programme\php

    rem *************************************

    PATH=%PATH%;%INSTPHP%;%INSTPHP%\extensions
    "%INSTPHP%\php.exe" control.php

    pause
    Ich muss gestehen, dass ist das, was auch in der aseco.bat steht... aber so geht das nunmal am einfachsten.
    Wenn man diese nun ausführt, ist das ist so, als wenn man die .php im Webbrowser öffnet und alle echos (prints etc.) angezeigt werden. Nur eben in einer .bat.
    Aber jetzt zurück zur Erklärung. Mit dem Befehl @echo off, am Anfang der Batch-Datei unterdrücken wir die Ausgabe des Befehls beim Ausführen der Datei. rem ist ein Kommentar und mit set kann man Variablen setzen(Hier sollte man seinen persönlichen Pfad zum PHP Installationsordner angeben).
    Am Ende lässt man das ganze noch ausführen, indem man einfach auf eine Exe (in diesem Fall zur php.exe) verweißt. Pause erklärt sich hoffentlich von selbst^^. Wenn man eine Datei (hier control.php) da hinterschreibt, wird diese mit der Exe ausgeführt. Ja und damit ist die Batch Datei(.bat) auch schon fertig.
    Als nächstes öffnen wir ein neues Dokument, stellen die Sprache auf php und
    speichern diese am besten erst mit dem Namen, den ihr hinter dem Pfad der php.exe geschrieben habt (hier control.php). Wir können nun die control.php erstellen und öffnen.
    Als erstes schreiben wir:
    PHP-Code:
    <?php
    require_once('GbxRemote.inc.php');
    define('nz'"\r\n");
    ?>
    Ich werde nicht auf die PHP-Befehle eingehen, da man ja die Vorrausetzung "Gute PHP-Kenntnisse" braucht. Die "GbxRemote.inc.php" ist bei dem Dedicated Server mit dabei und zu finden unter (Serverpfad/RemoteControlExamples/PhpRemote). Diese Datei ermöglicht das Kommunizieren mit dem Server.
    nz heißt hier neue Zeile.
    So, jetzt schreiben wir drunter:
    PHP-Code:
    <?php
    require_once('GbxRemote.inc.php');
    define('nz'"\r\n");
    class 
    control {

        public function 
    run() {
        echo 
    'Starte Control' nz;
        }
        }
    $control = new control;
    $control->run();
    ?>
    Tipp: Man muss keine Klasse erstellen. Dies dient nur zur Übersicht und der späteren, umso leichteren Handhabung.
    Wenn ihr jetzt die control.php (oder wie sie bei euch auch immer heißt^^), die control.bat und die "GbxRemote.inc.php" im gleichen Verzeichnis habt, könnt ihr mal die control.bat starten. Da sollte jetzt stehen:
    Starte Control
    Drücken Sie eine beliebige Taste...
    Das "Drücken Sie..." kommt von dem pause.
    Das davor geben wir jetzt ja per echo aus.
    Jetzt schreiben wir mal ein wenig um uns mit dem Server zu verbinden:
    PHP-Code:
    <?php
    require_once('GbxRemote.inc.php');
    define('nz'"\r\n");
    class 
    control {

        public function 
    run() {
        echo 
    'Starte Control' nz;
               
    $this->client = New IXR_Client_Gbx;
            
        If (!
    $this->connect(127.0.0.15000,  'SuperAdmin''supaadminpass')) {
                die(
    'Abgebrochen - Control konnte nicht verbinden!' nz);
            }
        }
    }
    $control = new control;
    $control->run();
    ?>
    Das scheint vielleicht etwas seltsam, aber auch ich weiß, dass die Funktion connect noch nicht existiert (kommt gleich^^).Es ist viel einfacher eine Funktion connect zu machen, da da gleich zwei Dinge erledigt werden. Das wäre in einer ein wenig...unübersichtlich. Die Klasse "IXR_Client_Gbx" ist in der "GbxRemote.inc.php". Naja sie steht halt für einen Clienten. Jetzt mal die Funktion connect:
    PHP-Code:
    <?php
    require_once('GbxRemote.inc.php');
    define('nz'"\r\n");
    class 
    control {

        public function 
    run() {
        echo 
    'Starte Control' nz;
               
    $this->client = New IXR_Client_Gbx;
            
        If (!
    $this->connect('127.0.0.1''5009',  'SuperAdmin''SuperAdminPasswort')) {
                die(
    'Abgebrochen - Control konnte nicht verbinden!' nz);
            } else {
            echo
    'Erfolgreich mit Server verbunden - Infos:' .nz;
            }
        }
        
        protected function 
    connect($Ip$Port$AuthLogin$AuthPassword) {
        
            if (!
    $this->client->InitWithIp($Ip$Port) {
                
    //error - server läuft nicht unter diesem port => offline
                
    echo'ERROR: Server laeuft nicht unter diesem Port!' .nz;
            } else {
            
                if (!
    $this->client->query('Authenticate'$AuthLogin$AuthPassword) {
                    
    //error nicht authentifiziert
                    
    echo'ERROR: Password falsch!' .nz;
                } else {

                return 
    true;
                
                }
            }
        }
    }
    $control = new control;
    $control->run();
    ?>
    Eigentlich eine simple Funktion. Wir lassen mit "new IXR_Client_Gbx;" ein Objekt dieser Klasse erstellen und greifen jetzt darauf zu. Die Funktion IntiWithIp ist zum Verbinden. Jetzt sollte es eigentlich klar werden.
    Auch query ist eine Funktion der Klasse und führt, wie sie auch heißt, Abfragen aus. Mit query('Authenticate', $AuthLogin, $AuthPassword) ist man als SuperAdmin auf dem Server angemeldet.
    Mann kann jetzt auf Methoden und Callbacks des Servers zugreifen.
    Übrigens: Für die nicht ganz so Intellektuellen unter uns - man muss bei dem Aufruf der Funktion natürlich die Daten mit seinen abgleichen. Ich glaube nicht, dass jemand das Superadmin Passwort: SuperAdminPasswort hat^^. Falls alles richtig ist, sollte jetzt, wenn man die .bat ausführt, dort noch ein: "Erfolgreich mit Server verbunden - Infos:" stehen.

    - Hey, ich will etwas wissen! -
    Jetzt wollen wir etwas vom Server wissen (bzw. bekommen[get]). Dazu gibt es die sogenannten Methoden. Z.B. können wir den Servernamen unter Infos anzeigen lassen. Dazu nutzen wir wieder query:
    PHP-Code:
    <?php
    require_once('GbxRemote.inc.php');
    define('nz'"\r\n");
    class 
    control {

        public function 
    run() {
        echo 
    'Starte Control' nz;
               
    $this->client = New IXR_Client_Gbx;
            
        If (!
    $this->connect('127.0.0.1''5009',  'SuperAdmin''SuperAdminPasswort')) {
                die(
    'Abgebrochen - Control konnte nicht verbinden!' nz);
            } else {
            
    $this->client->query('GetServerCoppers');
            echo
    'Erfolgreich mit Server verbunden - Infos:' .nz;
            echo
    'Copperstand: '$this->client->getResponse() .nz;
            }
        }
        
        protected function 
    connect($Ip$Port$AuthLogin$AuthPassword) {
        
            if (!
    $this->client->InitWithIp(strval($Ip), intval($Port))) {
                
    //error - server läuft nicht unter diesem port => offline
                
    echo'ERROR: Server laeuft nicht unter diesem Port!' .nz;
            } else {
            
                if (!
    $this->client->query('Authenticate'strval($AuthLogin), strval($AuthPassword))) {
                    
    //error nicht authentifiziert
                    
    echo'ERROR: Password falsch!' .nz;
                } else {

                return 
    true;
                
                }
            }
        }

    }
    $control = new control;
    $control->run();
    ?>
    in query() kommt dann die query, die einem zu Verfügung stehen, rein (ein Link zu einer guten Liste gibt es bei Links). Damit wir auch etwas zurückbekommen, gibt es noch die Funktion getResponse();.
    Es tut das, was wie sie auch heißt^^. Z.B. die Methode GetServerCoppers() gibt einen Integer-Wert (die Menge der Coppers) und GetVersion() ein Array mit Name, Version and Build zurück.
    Und damit nutzen wir die Methode GetServerCoppers() und bekommen den Copperstand des Servers zurück.
    Und schon haben wir etwas vom Server bekommen

    - Bla, bla, bla! -
    Mh, was könnte man sich da drunter vorstellen??
    Natürlich, z.B. Chatausgaben^^. Ja, da sind wir schon.
    Jetzt wollen wir nichts haben, wir wollen etwas setzen[set].
    Das sind....auch Methoden^^ Also ändert sich nichts
    Es wird wieder query benutzt:
    PHP-Code:
    $this->client->query('ChatSend''Test'); 
    Um etwas zu allen zu senden, kann man ChatSend(string) nehmen. Der String ist dann das, was geschickt werden soll. Mit dem Beispiel würde Test gesendet werden. Übrigens: Bei allen Set-Methoden braucht man getResponse() nicht.
    Man muss dazu sagen, dass dies nur einmal, wenn die Bat gestartet wird, gesendet wird^^. Alle die danach 'joinen', können nichts davon sehen.
    Dazu brauch man Callbacks, aber das ein anderes Mal

    -Tick, Tack -
    Nun kommen wir zur Uhr
    D.h. wir lassen ein Quad und ein Label 'dynamisch' auf dem Server anzeigen.
    Es ist so ziemlich das gleiche, die Methode ist: SendDisplayManialinkPage(string, int, boolean).
    Der String ist der ML, der Integer ist Timeout und das letzte ist erstmal egal^^. Zur Hilfe:
    PHP-Code:
    $this->client->query('SendDisplayManialinkPage''der manialink'0False); 
    Und so wäre die Uhr als ganzes:
    PHP-Code:
    while(true) {
    $this->client->query('SendDisplayManialinkPage', '<?xml version="1.0" encoding="UTF-8" ?>
            <manialink id="1">
            <timeout>0</timeout>
            <quad posn="43.8 39.8 0" sizen="5.5 2.9" style="Bgs1" substyle="NavButton" />
            <label text="' . date('H:i', time()) . '" textcolor="f00" posn="44 39.5 0" sizen="10 5" />
            </manialink>', 0, False);
            sleep(60);
                }
    Fertisch


    - Links -
    Hier ein paar Links:
    1. -Die Liste der Methoden: http://trab.gelaber.com/methods.php
    2. -xaseco (kann gut helfen): http://www.gamers.org/tmn/xaseco_110.zip


    PS. Ich antworte gerne auf Fragen, allerdings nur hier im Thread, NICHT per PN &
    Ich würd mich sehr freuen, wenn dieses Tutorial sticky gemacht wird. Es muss aber nicht sein

    Ich freue mich auf euer Feedback, greez MrLoL

  2. #2
    Erfahrener Benutzer Avatar von matrix142
    Registriert
    26.06.2010
    Beiträge
    1.049
    ManiaPlanet
    -=GR=-маדяוж142
    Login: matrix142
    Nickname: -=GR=-маדяוж142
    Zone: World » Europe » Germany » Bayern » Nürnberg
    Multiplayer: 24.068 (33.052 LP)
    Soloplayer: 5.607 (15.040 SP)
    Clan: Global Rebels Gaming
    ManiaLinks: gr-gaming
    TrackMania
    -=GR=-маדяוж142 ©
    Login: matrix142 United
    Nickname: -=GR=-маדяוж142 ©
    Zone: World » Germany » Bavaria » Nürnberg
    Multiplayer: 94.279 (60.605 LP)
    Soloplayer: 46.251 (6.575 SP)
    Clan: Global Rebels Gaming
    Links: TM-Ladder
    Hatte es im DS Forum auch schon geschrieben, gut gemacht


  3. #3
    Erfahrener Benutzer
    Registriert
    28.06.2010
    Ort
    Schleswig-Holstein
    Beiträge
    183
    ManiaPlanet
    .маясо
    Login: Marco01_809
    Nickname: .маясо
    Zone: World » Europe » Germany » Schleswig-Holstein » Kiel
    Multiplayer: 8.019 (60.931 LP)
    Soloplayer: 42.053 (619 SP)
    TrackMania
    .маясо
    Login: Marco01_809 United
    Nickname: .маясо
    Zone: World » Germany » Schleswig-Holstein » Kiel
    Multiplayer: 101.457 (60.300 LP)
    Soloplayer: 14.898 (37.998 SP)
    Links: TM-Ladder
    PHP-Code:
    <?php
    require_once('GbxRemote.inc.php'); // Unser Client
    define('nz'"\r\n"true); // \r\n erzeugt eine neue Zeile

    class controller {

        function 
    __construct($ip$port$user$password) { // die function __construct wird beim aufrufen der Klasse ausgeführt
            
    $this->client = new IXR_Client_Gbx(); // Der übliche Code folgt...
            
    echo 'Verbinde zu ' strval($ip) . ' auf ' strval($port) . ' ...' nz// Verbinden
            
    if (!$this->client->InitWithIp(strval($ip), intval($port))) {
                
    $this->errorcheck();
                die(
    '[Error] Konnte keine Verbindung zum Server herstellen!' nz);
            }
            echo 
    'Authentifiziere als ' strval($user) . ' ...' nz// Authentifizieren
            
    if (!$this->client->query('Authenticate'strval($user), strval($password))) {
                
    $this->errorcheck();
                die(
    '[Error] Konnte nicht autentifizieren!' nz);
            }
            echo 
    'Aktiviere Callbacks ...' nz// Callbacks aktiviren
            
    if (!$this->client->query('EnableCallbacks'true)) {
                
    $this->errorcheck();
                die(
    '[Error] Konnte Callbacks nicht aktivieren!' nz);
            }
            echo 
    'Setze Manialinkpages zurueck ...' nz// Alle Angezeigten Manialinks zurücksetzen
            
    if (!$this->client->query('SendHideManialinkPage')) {
                
    $this->errorcheck();
                die(
    '[Error] Konnte Manialinkpages nicht zurücksetzen!' nz);
            }
            echo 
    '... Fertig geladen!' nz;
        }

        function 
    run() { // Wird durch "$me->run()" aufgerufen
            
    while (true) { // In einer Endlosschleife machen wir folgendes;
                
    $this->client->readCB(); // Callbacks einlesen
                
    $this->errorcheck(); // Fehler prüfen
                
    $calls $this->client->getCBResponses(); // Callbacks von IXR_Client_Gbx abholen
                
    foreach($calls as $call) { // Falls die Calls nicht leer sind, für jeden folgendes ausführen:
                    
    $name $call[0]; // $call[0] enthält den namen
                    
    $data $call[1]; // $call[1] die Callbacks Daten
                    
    set_time_limit(20); // 20 Sekunden für jeden Durchgang maximal
                    
    switch ($name) { // Hier wird geprüft welchen Callback wir gerade dranhaben
                        
    case 'Trackmania.PlayerConnect':
                                
                        break;
                        case 
    'Trackmania.PlayerDisconnect':
                                
                        break;
                        case 
    'Trackmania.NewChallenge':
                                
                       break;
                       
    //default:
                       //    echo '[Controller Message -1000] Unknown Callback received' . nz;
                      //break;
                    
    }
                    
    $this->errorcheck(); // Nach jeder Ausführung auf Fehler prüfen...
                    
    usleep(1); // Script etwas ausbremsen (kann auch entfernt werden)
                
    }
                
    usleep(10); // Script etwas ausbremsen (kann auch entfernt werden)
            
    }
        }
        
        function 
    errorcheck() {
            if (
    $this->client->isError()) { // Falls es einen Fehler gibt...
                
    echo '[Client Message ' strval($this->client->getErrorCode()) . '] ' strval($this->client->getErrorMessage()) . nz// ... geben wir ihn aus ...
                
    $this->client->resetError(); // ... und setzen den Fehler zurück.
            
    }
        }
    }

    $ip '127.0.0.1';
    $port 5004;
    $user 'SuperAdmin';
    $password 'DEIN_PASSWORD';

    $me = new controller($ip$port$user$password);
    $me->run();
    ?>
    Hier nochmal der Code für Callbacks (updated)
    Freihand, weiß nicht ob er funzt. plz mal testen und antworten

    EDIT: So, hab ihn upgedated. Er funktioniert nun 100%
    EDIT2: Erneutes Update, läuft jetzt mit dem neuen PHP 5.3.3
    Geändert von Marco (01.09.2010 um 19:19 Uhr) Grund: Code-Update #2
    i5-2500K | P8Z68-V PRO | 16GB DDR3 | GTX670 Windforce 3X | 840 pro 256GB

  4. #4
    Erfahrener Benutzer Avatar von Askuri
    Registriert
    21.11.2010
    Ort
    Rheinland-Pfalz
    Alter
    21
    Beiträge
    1.065
    ManiaPlanet
    ғιяе»λsκμяιֻ
    Login: askuri
    Nickname: ғιяе»λsκμяιֻ
    Zone: World » Europe » Germany » Rheinland-Pfalz » Trier
    Multiplayer: 18.629 (41.737 LP)
    Soloplayer: 48.498 (430 SP)
    ManiaLinks: mgames
    TrackMania
    ғιяе»λςκμяι
    Login: alder_player United
    Nickname: ғιяе»λςκμяι
    Zone: World » Germany » Rhineland-Palatinate » Trier
    Multiplayer: 4.849 (70.709 LP)
    Soloplayer: 34.122 (11.150 SP)
    ManiaLinks: im
    Links: TM-Ladder
    Blog-Einträge
    3
    Soeben auf php.net gefunden. Man kann die Batch Datei auch viel kürzer gestalten. In etwa so:
    Code:
    @echo off
    "C:\xampp\php\php.exe" control.php
    pause
    Funktioniert genauso, ist ein viel verständlicherer Code und dazu noch kürzer
    Geändert von Askuri (06.04.2013 um 10:37 Uhr)

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •