Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Geleitwort
Vorwort
1 PEAR – Einführung
2 Authentication
3 Caching
4 Date and Time
5 File Formats
6 HTTP
7 Internationalization
8 Mail
9 Networking
10 PHP
11 Text
12 Web Services
13 Benchmarking
14 Configuration
15 Database
16 File System
17 HTML
18 Images
19 Logging
20 Math
21 Numbers
22 Tools and Utilities
23 XML
24 Selbst Pakete erstellen
25 PECL
Index
Ihre Meinung?

Spacer
 <<   zurück
PHP PEAR von Carsten Möhrke
Anwendung und Entwicklung – Erweiterungen für PHP schreiben
Buch: PHP PEAR

PHP PEAR
798 S., 39,90 Euro
Rheinwerk Computing
ISBN 3-89842-580-0
gp 9 Networking
  gp 9.1 Net_IPv4
  gp 9.2 Net_IPv6
  gp 9.3 Net_FTP
  gp 9.4 Net_POP3
  gp 9.5 Net_SMTP
  gp 9.6 Net_CheckIP
  gp 9.7 Net_IDNA
  gp 9.8 Net_Curl
  gp 9.9 Net_Socket
  gp 9.10 Net_UserAgent_Detect


Rheinwerk Computing

9.9 Net_Socket  toptop


Besprochene Version: 1.0.5 Lizenz: PHP-Lizenz
Klassendatei(en): Net/Socket.php

Net_Socket stellt Ihnen Funktionalitäten zur Verfügung, die eine direkte Kommunikation mit einem anderen Rechner auf Basis von Sockets ermöglichen. Ein Socket ist eine direkte Verbindung zu einem anderen Rechner auf einem bestimmten Port. Dieses Paket kann beispielsweise genutzt werden, um Netzwerk-Protokolle, die auf dem Layer 5 des OSI-Modells (http, IMAP, POP etc.) angesiedelt sind, zu implementieren. Interessant dabei ist, dass das Paket nicht auf die Socket-Funktionen von PHP angewiesen ist.

Alle Methoden dieser Klasse können einen PEAR_Error zurückgeben, wenn ein Fehler bei der Kommunikation aufgetreten ist.

Um eine Verbindung zu einem anderen Rechner aufzubauen, benötigen Sie ein Net_Socket-Objekt. Aus diesem heraus können Sie die Methode connect() aufrufen, die als ersten Parameter den Namen oder die IP-Adresse des entfernten Rechners übergeben bekommt. Übergeben Sie einfach nur die Adresse, wird eine TCP-Verbindung genutzt. Sie können aber auch ein anderes Protokoll verwenden, indem Sie den Namen des Protokolls vor die Adresse oder URL stellen (udp://www.example.org).

Möchten Sie herausfinden, welche Layer-4-Protokolle auf Ihrem Rechner zur Verfügung stehen, können Sie das, wenn Sie PHP 5 nutzen, mit diesen Zeilen ermitteln:

echo '<pre>'; 
print_r(stream_get_transports()); 
echo '</pre>';

Der zweite erforderliche Parameter ist die Nummer des TCP-Ports, über den die Verbindung aufgebaut werden soll.

Zusätzlich können Sie mit einem booleschen Wert definieren, ob es sich um eine persistente Verbindung handeln soll oder nicht. Eine persistente Verbindung wird nicht am Ende des Scripts geschlossen, sondern bleibt geöffnet, so dass bei der Ausführung des nächsten Scripts wieder darauf zugegriffen werden kann.

Der nächste Parameter gibt Ihnen die Möglichkeit, ein Timeout in Sekunden zu spezifizieren, das festlegt, wie lange Ihr Rechner maximal auf Daten von dem entfernten Rechner warten soll.

Der letzte Parameter dient dazu, Optionen für das verwendete Protokoll zu spezifizieren. Das heißt, Sie haben hier die Möglichkeit, in Abhängigkeit vom verwendeten Protokoll (tcp, udp, unix, …) Optionen zu spezifizieren. Diese müssen in Form eines Arrays übergeben werden. Der Schlüssel ist der Name des Protokolls, also z. B. 'tcp', der wiederum auf ein Array mit Daten verweist. Hier werden die Namen der Optionen als Schlüssel genutzt, die auf die Werte verweisen. [Weitere Informationen dazu finden Sie unter http://de.php.net/stream_context_create. ]

Sollte beim Aufbau der Verbindung ein Fehler auftreten, gibt die Methode ein PEAR_Error-Objekt zurück.

Nachdem Sie mit der Methode connect() die Verbindung geöffnet haben, können Sie Daten vom entfernten Rechner lesen oder Daten dorthin übertragen.

Zum Schreiben von Daten stehen die Methoden write() und writeLine() zur Verfügung. Beide bekommen die zu schreibenden Daten als Parameter übergeben und senden sie direkt an den anderen Rechner. Der Unterschied zwischen den beiden Methoden besteht darin, dass writeLine() die gesendeten Daten automatisch um einen Zeilenumbruch, dargestellt durch \r\n, ergänzt.

Für die Leseoperationen wird zwischen dem Blocking- und dem Non-Blocking-Modus unterschieden. Versuchen Sie Daten von einem Socket zu lesen, der im Non-Blocking-Modus ist, versucht die lesende Methode die Daten zu lesen. Liegen keine Daten vor, läuft das Script weiter. Im Blocking-Modus wartet die lesende Methode, bis Daten vorliegen oder bis das Timeout erreicht ist. Der blockierende Modus ist immer dann hilfreich, wenn Sie wissen, dass der Server ein wenig Zeit braucht, um zu antworten.

Die Methode isBlocking() liefert Ihnen ein true oder false, um Ihnen mitzuteilen, ob der Port sich im blockierenden Modus befindet oder nicht. Um den Modus einzuschalten, können Sie der Methode setBlocking() den Wert true übergeben, wohingegen false den Modus ausschaltet.

Zum eigentlichen Lesen von Daten sind insgesamt neun Methoden definiert. gets() bekommt eine Zahl übergeben, die definiert, wie viele Bytes maximal eingelesen werden sollen. Die Methode liest so lange Daten über den Socket ein, bis die maximale Anzahl erreicht ist,oder ein Zeilen- oder ein Dateiende gefunden wird. Die Methode read() verhält sich sehr ähnlich. Auch Sie bekommt eine Anzahl von maximal zu lesenden Bytes übergeben. Allerdings überliest sie Zeilenumbrüche und sollte genutzt werden, wenn Sie exakt wissen, wie viele Daten (Bytes) der andere Rechner Ihnen übergeben wird.

Eine Methode, die mit Vorsicht zu genießen ist, ist readAll(). Sie bekommt keine Parameter übergeben und liest so lange Daten, wie der Socket geöffnet ist. Das kann bei einem Socket, der im Blocking-Modus ist, unter Umständen zum Problem werden.

Unproblematischer ist da schon readLine(). Diese Methode bekommt keinen Parameter übergeben und liest so lange Daten vom Socket, bis ein Zeilenende erreicht wird oder keine weiteren Daten mehr vorliegen, weil der Socket geschlossen wurde oder ein EOF erhalten hat.

Die folgenden Member-Funktionen sind deutlich spezialisierter. Mit readByte() wird exakt ein Byte von dem Socket gelesen und zurückgegeben. readWord() liest ein Wort, also zwei Bytes, von dem Socket. Hierbei sollten Sie beachten, dass einige Hardware-Architekturen das hochwertige und das niederwertige Byte vertauschen.

readString() liest einen nullterminierten String ein. Hierbei handelt es sich um einen String, der in C-typischer Schreibweise mit einem \0 endet.

Um einen Integer-Wert einzulesen, ist die Methode readInt() vorgesehen. Sie liest vier Byte ein und liefert diese als Integer-Wert zurück.

Die letzte Methode zum Lesen von Daten ist readIPAddress(). Sie liefert Ihnen eine IP4-IP-Adresse zurück. Um diese zu ermitteln, werden vier Bytes eingelesen und in die übliche IP-Notation umformatiert. Somit würde sich aus den Bytes FA, A0, 10 und 0F die IP-Adresse 250.160.16.15 ergeben, die als String zurückgegeben wird.

Folgendes Beispiel ist eine Implementation des Time-Protokolls, mit dem Sie einen aktuellen Timestamp bei einem Zeit-Server abholen können. Das Protokoll sieht vor, dass man sich auf Port 37 mit dem Server verbindet und ihm ein leeres Datenpaket sendet. Danach stellt der Server den aktuellen Timestamp zur Verfügung, der direkt ausgelesen werden kann. Dieser liegt in einem binären Format vor und muss somit erst konvertiert werden. Des Weiteren handelt es sich nicht um einen Unix-Timestamp. Er bezieht sich auf den 01.01.1900. Daher müssen 2.208.988.800 Sekunden subtrahiert werden, um die Information in einen Unix-Timestamp umzuwandeln.

require_once('Net/Socket.php'); 
 
// Neues Objekt ableiten 
$socket = new Net_Socket() ; 
 
// Verbindung zum Zeit-Server aufbauen 
$result=$socket->connect("ptbtime1.ptb.de", 37); 
// Ist ein Fehler beim Verbindungsaufbau aufgetreten? 
if (true===PEAR::isError($result)) 
{ 
   die ($result->getMessage()); 
} 
 
// Leeres Paket an den Server senden 
$socket->writeLine(''); 
 
// Daten vom Server auslesen 
$result = $socket->readLine(); 
 
// Fehler aufgetreten? 
if (true===PEAR::isError($result)) 
{ 
   die ($result->getMessage()); 
} 
$socket->disconnect(); 
// Daten konvertieren 
$time_hex=bin2hex($result); 
$time=hexdec($time_hex); 
// Timestamp ins Unix-Format konvertieren 
$time=$time-2208988800; 
echo date ('d. M Y  G:i:s ',$time); 
// Ausgabe: 24. Feb 2005 21:41:38

Listing 9.12 Auslesen der aktuellen Uhrzeit mit Net_Socket

Zusätzlich sind noch die folgenden, nützlichen Methoden definiert. Mit setTimeout() können Sie ein neues Timeout definieren. Die Methode erwartet zwei Zahlen als Parameter. Die erste Zahl ist die Anzahl der Sekunden und die zweite die der Mikrosekunden, nach denen ein Timeout erfolgen soll.

Aktuelle Informationen über den Socket können Sie mit der Methode getStatus() auslesen, die Ihnen ein umfangreiches Array mit Informationen zurückgibt:

array(7) { 
  ["stream_type"]=> 
  string(10) "tcp_socket" 
  ["mode"]=> 
  string(2) "r+" 
  ["unread_bytes"]=> 
  int(0) 
  ["seekable"]=> 
  bool(false) 
  ["timed_out"]=> 
  bool(false) 
  ["blocked"]=> 
  bool(true) 
  ["eof"]=> 
  bool(true) 
}

Möchten Sie nur feststellen, ob die Datenübertragung beendet wurde, können Sie die Methode eof() nutzen, die einen booleschen Wert zurückgibt.

 <<   zurück
     
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: PHP PEAR
PHP PEAR
Jetzt Buch bestellen!
 Ihre Meinung?
Wie hat Ihnen das Openbook gefallen?
Ihre Meinung

 Buchtipps
Zum Rheinwerk-Shop: PHP 5.6 und MySQL 5.7






 PHP 5.6 und
 MySQL 5.7


Zum Rheinwerk-Shop: Einstieg in PHP 5.6 und MySQL 5.6






 Einstieg in PHP 5.6
 und MySQL 5.6


Zum Rheinwerk-Shop: Responsive Webdesign






 Responsive Webdesign


Zum Rheinwerk-Shop: Moderne Websites entwickeln






 Moderne Websites
 entwickeln


Zum Rheinwerk-Shop: MySQL 5.6






 MySQL 5.6


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo








Copyright © Rheinwerk Verlag GmbH 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern