PHPGangsta - Der praktische PHP Blog

PHP Blog von PHPGangsta


Sockets, Streams und Streamfilter

with 5 comments

In einem älteren Artikel schrieb ich bereits über Socket Server in PHP, heute möchte ich etwas sehr ähnliches vorstellen, jedoch mittels Streams, wo uns andere Möglichkeiten zur Verfügung stehen.

Ich möchte nun also auf einen Socket, sprich häufig einen TCP-Port, zugreifen und ihn als Datenstrom behandeln. Dazu erstellen wir erstmal einen Server, der auf Port 1037 lauscht und bei einer Verbindung einen String zurückliefert.

<?php
$socket = stream_socket_server('tcp://0.0.0.0:1037');
while ($conn = stream_socket_accept($socket)) {
	fwrite($conn, "Hallo, hier spricht der Server.\n");
	fclose($conn);
}
fclose($socket);


Nun können andere Anwendungen auf diesen Port zugreifen.

<?php
$socket = stream_socket_client('tcp://127.0.0.1:1037');
while (!feof($socket)) {
	echo fread($socket, 100);
}
fclose($socket);

Zuerst starten wir den Server…

php streamserver.php

… dann den Client…

php streamclient.php
Hallo, hier spricht der Server.

Der Server wartet nun also auf eine Verbindung. Der Client verbindet sich zum entsprechenden Port, liest alle Daten vom Stream und beendet sich. Eine einfache Kommunikation zwischen 2 Programmen auch über Rechnergrenzen hinweg ist so möglich.

Bei Streams ist es möglich, die Daten vorher noch durch einen Filter laufen zu lassen. In diesem Fall habe ich mir überlegt möchte ich die übertragenen Daten komprimieren. Das geht ganz einfach, wir erweitern unsere beiden Dateien um jeweils eine Zeile (stream_filter_append):

<?php
$socket = stream_socket_server('tcp://0.0.0.0:1037');
while ($conn = stream_socket_accept($socket)) {
	stream_filter_append($conn, 'zlib.deflate');
	fwrite($conn, "Hello World\n");
	fclose($conn);
}
fclose($socket);
<?php
$socket = stream_socket_client('tcp://127.0.0.1:1037');
stream_filter_append($socket, 'zlib.inflate');
while (!feof($socket)) {
	echo fread($socket, 100);
}
fclose($socket);

Nun werden die Daten im Server komprimiert und im Client dekomprimiert. Es gibt natürlich noch viele weitere Filter, und man kann natürlich auch eigene Filter erstellen. Die vorhandenen Filter kann man mit der stream_get_filters() Funktion abfragen:

array(10) {
  [0]=>
  string(15) "convert.iconv.*"
  [1]=>
  string(12) "string.rot13"
  [2]=>
  string(14) "string.toupper"
  [3]=>
  string(14) "string.tolower"
  [4]=>
  string(17) "string.strip_tags"
  [5]=>
  string(9) "convert.*"
  [6]=>
  string(8) "consumed"
  [7]=>
  string(7) "dechunk"
  [8]=>
  string(6) "zlib.*"
  [9]=>
  string(7) "bzip2.*"
}

Weitere Informationen finden sich natürlich im PHP Manual.

Written by Michael Kliewe

April 20th, 2010 at 9:46 am

5 Responses to 'Sockets, Streams und Streamfilter'

Subscribe to comments with RSS or TrackBack to 'Sockets, Streams und Streamfilter'.

  1. […] PHP Gangsta beschreibt in seinem Blog wie man mit PHP Socket Stream Server erstellt und abfragt. Außerdem […]

  2. Hi,

    wo liegt denn der Unterschied zwischen socket_create(,SOCK_STREAM,) und stream_socket?

    Keks

    20 Apr 10 at 17:42

  3. Schade, dass niemand darauf antwortet..

    Keks

    25 Apr 10 at 02:24

  4. @Keks: Ich weiß es nicht genau ob es große technische Unterschiede gibt. Man hat beim stream_socket wie man oben sieht etwas andere Funktionen zur Verfügung (Filter). Bin aber überfragt…

    Michael Kliewe

    25 Apr 10 at 10:08

  5. YMMD with that aneswr! TX

    Aminu

    20 Feb 12 at 09:54

Leave a Reply

You can add images to your comment by clicking here.