Para escribir un servidor basta con heredar de la clase Net::Server. Si se quiere un servidor con cierta personalidad se debe heredar de la correspondiente clase específica Net::Server::Multiplex.
pp2@nereida:~/src/perl/NET_SERVER$ cat -n synopsis.pl
1 #!/usr/bin/perl -w -T
2 package MyPackage;
3
4 use base qw(Net::Server); # Heredamos de Net::Server
5
6 sub process_request {
7 my $self = shift;
8 while (<STDIN>) {
9 s/\r?\n$//;
10 print "You said '$_'\r\n"; # basic echo
11 last if /quit/i;
12 }
13 }
14
15 MyPackage->run(port => 16000);
La definición de la conducta del servidor proveído se completa y/o modifica
mediante la definición de ciertos métodos.
quizá el mas esencial sea el método process_request cuya función
es manejar la comunicación: dar el servicio. Es llamado con el objeto
Net::Server como argumento. Cuando se le llama STDIN y STDOUT
han sido redirigidos al socket conectado al cliente.
El método run arranca el servicio. Existen múltiples formas de llamarlo:
MyPackage->run(port => 20201);
MyPackage->new({port => 20201})->run;
my $obj = bless {server=>{port => 20201}}, 'MyPackage';
$obj->run;
sigue un ejemplo de ejecución:
pp2@nereida:~/src/perl/NET_SERVER$ ./synopsis.pl 2008/05/22-18:24:26 MyPackage (type Net::Server) starting! pid(26653) Binding to TCP port 16000 on host * Group Not Defined. Defaulting to EGID '1040 1040 1012 33' User Not Defined. Defaulting to EUID '1040' |
pp2@nereida:~/src/perl/NET_SERVER$ telnet localhost 16000 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello! You said 'Hello!' Formidable! You said 'Formidable!' quit You said 'quit' Connection closed by foreign host. |
El método definido por defecto para process_request es básicamente igual al del ejemplo anterior e implanta un sencillo servidor de eco. Esta ejecución muestra como re-escribir el servidor el ejemplo anterior en una línea:
$ perl -MNet::Server -e 'use base 'Net::Server'; __PACKAGE__->run' 2008/05/27-16:04:58 main (type Net::Server) starting! pid(18510) Port Not Defined. Defaulting to '20203' Binding to TCP port 20203 on host * Group Not Defined. Defaulting to EGID '1040 1040 1012 33' User Not Defined. Defaulting to EUID '1040' |
$ telnet localhost 20203 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Welcome to "main" (18510) JAPH main:18510: You said "JAPH" Just Another Perl Hacker main:18510: You said "Just Another Perl Hacker" quit main:18510: You said "quit" Connection closed by foreign host. pp2@nereida:~/doc/book$ |
Casiano Rodríguez León
