Artikel im Internet unter http://www.hidemail.de/blog/client---server---beispiel-mit-io--socket.shtml.
Donnerstag, 10.1.2008, 12:48:23 Uhr

Client - Server - Beispiel mit IO::Socket


Ich habe mir doch vor Wochen 'nen Wohnzimmer-PC zusammengeschraubt... und hatte schon immer im Hinterkopf, wie ich das Thema auch in Perl einbauen kann.

Heute kam mir dann die Erleuchtung: Mal eben Perl auf das Teil installiert und versucht, per Perl Musik und Filme auf meinen Laptop zu übertragen.

Und da stellten sich mir gleich mehrere Probleme:
Die Verbindung geht über Netzwerk, und ich mußte die Daten vom Server lesen und auf dem Laptop lokal speichern.

Was also fehlt, ist eine Client-Server Lösung.

Also ich mich schlaugelesen, etwas herumprobiert, und zu folgendem Ansatz gekommen:

Ein Datenspeicher im Netzwerk
Geschrieben hab ich ein kleines Script, das auf Kommando Daten einliest und speichert oder angeforderte Daten ausgibt.

Hier das serverseitige Script:

use IO::Socket;
use strict;
my %datas=();


my $socket = new IO::Socket::INET (
LocalPort => 11011, Type => SOCK_STREAM,
Listen => SOMAXCONN, Reuse => 1
);
die "Unable to setup socket: $!\n" unless defined $socket;
while (defined(my $conn = $socket->accept)) {

my $a;
$conn->recv($a,100000);

(my $befehl, my $name, my $wert)=split("!!!",$a);

if ($befehl eq 'get'){
print $conn $datas{$name};
#print "getting $name\n";
}

if ($befehl eq 'put'){
$datas{$name}=$wert;
# print "putting $name with $wert\n";
}

$conn->close;
}



Dieses Script startet einen Server, der auf die Portnummer 11011 "hört".
Als Parameter wird folgendes verwendet:
get: Holt Daten aus dem Speicher und gibt sie an den Clienten zurück. Das Format ist get!!!Name_des_Datensatzes

put: Schreibt Daten in den Speicher. Format put!!!Name!!!Daten

Die Daten werden im Rechnerspeicher gehalten, ist ja auch nur zum Üben gedacht...
Der Server läuft übrigens permanend im Hintergrund und wartet undendlich lange auf Anfragen. Man muß ihn also bei Bedarf per Hand wieder stoppen.


Der Client sieht so aus:

use IO::Socket;
use strict;


# Daten schreiben in Datenspeicher-Server
my $socket = new IO::Socket::INET (
PeerAddr => '192.168.0.166', PeerPort => 11011,
Type => SOCK_STREAM,
);
die "Unable to open connection: $!\n"
unless defined $socket;
$socket->send( "put!!!Franz!!!Franz");

print while(<$socket>);

######################
# Daten auslesen
######################
my $socket = new IO::Socket::INET (
PeerAddr => '192.168.0.166', PeerPort => 11011,
Type => SOCK_STREAM,
);
die "Unable to open connection: $!\n"
unless defined $socket;
$socket->send( "get!!!Franz!!!1");

print while(<$socket>);



Diese Script schreibt in den Server erst den Datensatz Franz mit dem Wert Franz, danach wird der Franz wieder abgerufen und ausgegeben.
Unter PeerAddr steht übrigens die IP des Wohnzimmer-PC's, unter PeerPort wieder die 11011.

Wie gesagt, das ist nur zum Üben...
Aber da fallen mir noch so einige Sachen zu ein... zum Beispiel, und da komm ich wieder auf meinen Cache zurück, könnte man ja einen dicken Netzwerk-Cache einrichten.
Möglich wäre auch ein Proxy-Server für's surfen... oder oder oder...

Übrigens:
Ich weiß, die Cracks unter uns werden jetzt nur müde mit dem Kopf schütteln, aber: Für jemanden, der damit noch nie gearbeitet hat, muß das doch erst mal erarbeitet werden...

In diesem Sinne... bis denne denne!




Artikel im Internet unter http://www.hidemail.de/blog/client---server---beispiel-mit-io--socket.shtml.