Home
Navigation
Impressum
Coder Welten - Programmierung und Optimierung
Coder Welten
 
 

 

 

OOP: Socket-Klasse mit einer Formular-Klasse kombinieren

Abruf wie durch einen einfachen Bot - II

Übersicht » Einführung OOP

Beispiele:

  1. Parserklasse (eine simple Parserklasse für ein einfaches XML-Dokument)
  2. Socket Klasse (eine TCP/IP Socket Klasse zum Abruf wie durch einen Bot)
  3. Formular Klasse (Socket-Klasse mit einer Formular-Klasse kombinieren)
  4. cURL Klasse (eine cURL Session initialisieren und ausführen)
  5. CSV Klasse (zum Auslesen (rückwärts) von umfangreichen CSV-Dateien)

Hinweise zum Script

Das Script auf dieser Seite baut auf das unter dem Stichpunkt "Socket Klasse" veröffentlichte Code-Listing auf. Doch im Unterschied zum vorausgehenden Listing, bei dem der Code für die Überprüfung der vom Formular übermittelten Daten noch im prozeduralen Stil verfasst wurde, übernimmt in diesem Listing eine eigene Klasse diese Überprüfung. Sollte das Script nicht die erwarteten Ergebnisse liefern, so beachten Sie bitte die Hinweise unter "Voraussetzungen und Aufruf des Scripts".

Code-Listing/Script:

<?php
error_reporting(E_ALL);

/*-- Überprüfung der vom Formular übermittelten URL ---------------------------*/

class EmpfangMessage {

    private $dompath = "";
    private $domain  = "www.example.com";
    private $seite   = "/";

    public function pruefeMessage() {

        if (isset($_GET["abrufen"]) and !empty($_GET["abrufen"])) {

            $abrufen = trim($_GET["abrufen"]);
            $hrefpos = stripos($abrufen, "http://");
            $abrufen = preg_replace("/[^a-zA-Z0-9.:?&\/=_-]/", "", $abrufen);

            if ($hrefpos === false) {
                $abrufen = "http://".$abrufen;
            }
            $this->dompath = parse_url($abrufen);
            return $this->dompath;
        }
    }
    public function liefereHost() {

        if (isset($this->dompath["host"]) and !empty($this->dompath["host"])) {
            $dhost = $this->dompath["host"];
        }
        else {$dhost = $this->domain;
        }
        return $dhost;
    }
    public function lieferePfad() {

        if (isset($this->dompath["path"]) and !empty($this->dompath["path"])) {
            $pfad = $this->dompath["path"];

            if (isset($this->dompath["query"]) and !empty($this->dompath["query"])) {
                $pfad .= "?".$this->dompath["query"];
            }
        }
        else {$pfad = $this->seite;
        }
        return $pfad;
    }
}

/*-- Klasse zum Aufbau einer TCP/IP Socket Verbindung -------------------------*/

class WieBot {

    public $domain = "";
    public $seite  = "";

    public function getVerbindung() {

        $request  = "GET ".$this->seite." HTTP/1.1\r\n";
        $request .= "Host: ".$this->domain."\r\n";
        $request .= "User-Agent: Mozilla/5.0 (compatible; Demo Botklasse 0.1)\r\n";
        $request .= "Connection: Close\r\n\r\n";
        $dienstp  = getservbyname("www", "tcp");
        $adresse  = gethostbyname($this->domain);
        $socket   = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        $gebeaus  = "";

        if ($socket != false) {
            $sockett = "TCP/IP Socket (Endpunkt) wurde erzeugt: OK.<br>\n";
        }
        else {
            $sockett = "TCP/IP Socket (Endpunkt) wurde nicht erzeugt: Grund: ".
            socket_strerror($socket)."<br>\n";
        }

        $verbindg = socket_connect($socket, $adresse, $dienstp);

        if ($verbindg != false) {
            $verbindgt = "Eine Verbindung zu ".$adresse." ".
            "über Port ".$dienstp." wurde aufgebaut: OK.<br>\n";
        }
        else {
            $verbindgt = "Der Verbindungsaufbau schlug fehl. ".
            "Grund: ".$verbindg." ".socket_strerror($verbindg)."<br>\n";
        }

        $gesendet = socket_write($socket, $request, strlen($request));

        if ($gesendet !== false) {
            $gesendett = "Ein HTTP GET Request wurde gesendet: OK.<br>\n";
        }
        else {
            $gesendett = "Es wurde kein Request gesendet!<br>\n";
        }

        while ($ausgabe = socket_read($socket, 1000)) {

            $gebeaus .= htmlentities($ausgabe, ENT_QUOTES);
        }

        socket_close($socket);
        $endeges = "Der Socket (Endpunkt) wurde geschlossen: OK.<br>\n\n";

        return "<span style=\"color:#862000\">".$sockett.$verbindgt.$gesendett."</span>\n<hr>\n".
        "<pre>".$gebeaus."</pre>\n<hr>\n<span style=\"color:#862000\">".$endeges."</span>\n";
    }
}

/*-- Vorbereitungen für die Ausgabe -------------------------------------------*/

$vonform = new EmpfangMessage();        // Erzeugen und Instanziieren des Objektes EmpfangMessage
$vonform->pruefeMessage();              // Aufruf der Methode pruefeMessage um die Eigenschaft $dompath zu verändern
$fuerhost = $vonform->liefereHost();    // Rückgabewert der Methode liefereHost der Variablen $fuerhost zuweisen
$fuerpfad = $vonform->lieferePfad();    // Rückgabewert der Methode lieferePfad der Variablen $fuerpfad zuweisen

$vonbot = new WieBot();                 // Erzeugen und Instanziieren des Objektes WieBot
$vonbot->domain = $fuerhost;            // übernommener Wert der Eigenschaft $domain zuweisen
$vonbot->seite  = $fuerpfad;            // übernommener Wert der Eigenschaft $seite zuweisen
$ausgabe = $vonbot->getVerbindung();    // Rückgabewert der Methode getVerbindung für Ausgabe

strlen($fuerpfad) > 1 ? $fuerform = $fuerpfad : $fuerform = "";
?>
<!DOCTYPE html>
<html>

<head>
<title>Abruf wie durch Bot</title>
</head>

<body>
<div style="text-align:center">
<h1>Abruf wie durch Bot</h1>

<?php echo htmlentities($fuerhost.$fuerform, ENT_QUOTES)."<br>\n"; ?>

<form action="<?php echo basename($_SERVER["PHP_SELF"]); ?>" method="get">
  <input type="text" name="abrufen" size="60" maxlength="120"><br>
  <input type="reset" value=" Reset ">
  <input type="submit" value=" Senden ">
</form>
</div>
<?php echo $ausgabe; ?>
</body>
</html>

Ob OOP in diesem Beispiel der strukturierten Programmierung vorzuziehen, sei als Frage in den Raum gestellt. Zumindest erweckt der Code auf dieser Seite gegenüber dem Code aus dem vorausgehenden Beispiel einen etwas aufgeblähten Eindruck, ohne dass sich Vorteile zu erkennen geben würden.
Bei diesbezüglichen Überlegungen sollte jedoch nicht vergessen werden, dass für den Aufbau der Verbindung eine hardwarenahe Schnittstelle für Socket-Ver­bindungen genutzt wurde. Einfacher geht es hingegen mit cURL, wobei die Klasse fürs Formular einfacher ausfällt und für andere, ähnlich gelagerte Anwendungen durchaus verwendbar. Dazu im nächsten Beispiel mehr.

Socket Klasse « / » cURL Klasse

 

Copyright © Verlag Horst Müller - Stendal - 2006 - Impressum - Datenschutz - Nutzungsbedingungen