|
Single-Thread-Server und -Client in PerlEin einfacher Server wurde schon im letzten Kapitel kurz vorgestellt. Diesmalsoll er genauer betrachtet werden. Der Server "bewacht" den Port 2000, kann alsoauch von jedem Benutzer gestartet werden. Zuerst wird ein neuer Socket für diesenPort eingerichtet. Der Parameter "Reuse" (sprich "Re-Use") erlaubt diesofortige Wiederverwendung des Ports, wenn der Client "aufgelegt" hat. Mit "Listen" wird der Standardwert von fünf Anfragen in der Warteschlangefestgelegt. Danach wartet das Programm auf eine Kontaktaufnahme des Clients($client = $sock->accept()). Sobald eine Verbindung steht, meldet derServer mit welchem Rechner die Verbindung aufgenommen wurde. Damit es etwaskurzweiliger als beim einfachen Echo-Server wird, handelt es sich diesmal um einenOhce-Server, der jede Eingabezeile gespiegelt zurückschickt. Womit auchgleich festgelegt wäre, daß der Server textzeilenorientiert arbeitet.Sobald der Client keine Daten mehr liefert (Eingabe Ctrl-D), wird die Verbindung beendet.
#!/usr/bin/perl# tcp-server-st.pl -- Ein Single-threaded-TCP-Serveruse strict;use IO::Socket;use constant MYPORT => 2000;my $sock = '';my $client = 0;$sock = new IO::Socket::INET(LocalPort => MYPORT, Reuse => 1,
Listen => 5)
or die "can't create local socket: $@\n";
print "Accepting connections on Port ", MYPORT, "...\n";
while ($client = $sock->accept())
{
# Eine Verbindung ist eingetroffen.
print "Accepted connection from ",
$client->peerhost(), ":", $client->peerport(), "\n";
# Echo, das alles umdreht:
while (<$client>)
{
chomp;
print $client scalar(reverse($_)), "\n";
}
$client->close() if defined $client;
}
Solange der Server mit einem Client in Verbindung ist, kann er keine weiteren
Anfragen entgegennehmen. Sobald dann fünf Client-Anfragen in der Warteschlange
stehen werden weitere Anfragen abgewiesen.
Der Client dazu kann auch zum Testen weiterer Demonstrations-Server verwendet werden.
Hier ist die Parameterversorgung beim Erzeugen eines neuen Socket etwas anders. Die
Adresse des zu kontaktierenden Servers und die Portnummer werden über die
Kommandozeile eingegeben. Statt "Reuse" und "Listen" werden
beim Client das Protokoll (TCP) und ein Timeoutwert übergeben. Der Client bricht
somit nach 5 Sekunden ab, wenn keine Verbindung zustandekommt.
Der Client schickt alle Eingabezeilen zum Server. Falls zwischendurch Zeilen vom
Server angekommen sind, werden Sie entgegengenommen und auf der Standardausgabe
ausgegeben.
#!/usr/bin/perl
# tcp-client.pl -- Ein einfacher TCP-Client.
# Verwendung: $0 remote_host remote_port
use strict;
use IO::Socket;
use constant TIMEOUT => 5;
my $sock = '';
my $reply = '';
$sock = new IO::Socket::INET(PeerAddr => $ARGV[0],
PeerPort => $ARGV[1],
Proto => 'tcp', Timeout => TIMEOUT)
or die "can't connect to $ARGV[0]:$ARGV[1]: $@\n";
while (<STDIN>)
{
print $sock $_;
last unless defined($reply = <$sock>);
print ">> $reply";
}
$sock->close() if defined $sock;
Der Nachteil des Single-Thread-Servers besteht hauptsächlich darin,
daß keine neuen Clientanfragen entgegengenommen werden, solange der
Server noch mit einem anderen Partner kommuniziert. Das Problem löst
die folgende Erweiterung.
|
|
|