Introducción

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
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19