Sockets, Streams und Streamfilter
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.
[…] PHP Gangsta beschreibt in seinem Blog wie man mit PHP Socket Stream Server erstellt und abfragt. Außerdem […]
Socket Streamserver mit Streamfiltern erstellen » PHP » PHP und MySQL Werkzeugkasten
20 Apr 10 at 11:41
Hi,
wo liegt denn der Unterschied zwischen socket_create(,SOCK_STREAM,) und stream_socket?
Keks
20 Apr 10 at 17:42
Schade, dass niemand darauf antwortet..
Keks
25 Apr 10 at 02:24
@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
YMMD with that aneswr! TX
Aminu
20 Feb 12 at 09:54