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