|
|
|||||||||||||||||||||||||
|
IntroducciónEn una de mis rutinarias navegaciones por perlmonks.org, me encontré un tutorial bastante interesante. En cuanto termine de leerlo tuve la necesidad de traducirlo y ponerlo en el sitio. El tutorial es de perlmonkey y lo pueden encontrar en su forma original aquí. Como siempre hago al traducir un tutorial, le cambio ciertas palabras y explico con mayor detalle lo que siento que necesita mayor explicación. Creando nuestro servidorEs impresionante lo sencillo que es crear un robusto servidor que dejará a tus amigos y colegas con la boca abierta usando perl. Para esto usamos el módulo IO::Socket, que nos da una sencilla interface orientada a objetos para tomar control de nuestros sockets. Para empezar, nuestro servidor necesita un socket para escuchar, comúnmente llamado "listening socket", a este socket es a donde nuestros clientes se conectan. No es cosa del otro mundo crear este socket:
#creando un socket para escuchar
my $listen_socket = IO::Socket::INET->new(LocalPort => 8000, Listen => 10, Proto => 'tcp', Reuse => 1); Esto creará un socket para escuchar en el host local bajo el puerto 8000, usando el protocolo TCP. El parámetro "Listen" es el máximo de clientes que podemos tener en "queue" o cola. Y "Reuse" te permite reiniciar el puerto 8000. Estos son los parámetros básicos que usaremos. Para manejar un cliente intentando conectar, la siguiente línea creará el socket para el cliente: my $connection = $listen_socket->accept;
Aquí la variable $connection es un objeto de socket, que puede ser manejado como un objeto de archivo. Así que puedes imprimir o leer de él como lo harías con un archivo:
#Escribir al socket del cliente
print $connection "Hello Client!"; #leer del socket del cliente Lo siguiente que debemo que ver tiene que ver con el "fork" de nuestro servidor. Cuando un proceso hijo muere, no libera los recursos del sistema hasta que el proceso padre reconoce que esta muerto con la llamada de las funciones "wait" o "waitpid". Como los servidores por lo general trabajan por mucho tiempo, y se terminan varios procesos hijos, se hace necesario asegurarnos de que el proceso padre se este enterando que los procesos hijos se están muriendo, si no se da cuenta el proceso padre, entonces los procesos hijos se convierten en "zombies". Los servidores normalmente se la pasan la mayoría de su tiempo en la llamada "accept" esperando llamadas de nuevos clientes esperando conectarse. Pero el problema, es que también está esperando que los procesos hijos se mueran, entonces ¿cómo puede hacer el servidor dos cosas a la vez? Fácil: con señales. Cuando un proceso hijo se muere manda una señal SIGCHLD al proceso padre. Entonces nuestro servidor necesita registrar una llave de señal para llamar a la función "waitpid" cada vez que se manda la señal SIGCHLD:
#crear la llave de la señal
$SIG{CHLD} = \&REAPER; #rutina para prevenir los zombies Entonces ya para nuestro player de MP3 no hay mucho que añadir. Básicamente el servidor empieza, entonces un cliente llega (por ejemplo xmms o mpgl23) abriendo un socket. Entonces el servidor hace un "fork" y regresa un socket al proceso hijo. Finalmente en proceso padre regresa para seguir escuchando y esperando a otro cliente. El proceso hijo simplemente irá en un loop continúo tocando canciones de nuestro lista de canciones aleatoriamente hasta que el cliente deje de escuchar.
NOTA: Puedes crear una lista de canciones MP3 usando el Winamp. O usando algo como: find / -name "*.mp3" > playlist.m3u
Código del servidorAquí esta el código final de nuestro servidor:
#!/usr/bin/perl -w
use strict; #tomar el puerto a controlar o por default 8000 #ignorar procesos hijos para evitar zombies #crear el socket a escuchar #asegurarnos que estamos controlando el puerto warn "Server ready. Waiting for connections ... \n"; #esperar conexiones #¡el hijo! #cerrar el puerto para escuchar el proceso hijo #llamar la funcion principal del hijo #si el hijo regresa salte #¿quién se conectó? #cerrar la conexión, ya fue mandada a un hijo } sub play_songs{ my $socket = shift; #sacar todas las canciones posibles #crear el creador de canciones random #crear un loop eterno hasta que el cliente deje de escuhar #Mandar el header necesario #seleccionar una canción aleatoria de tu lista #que cancion estamos tocando #abrir la cancion o intentar con otra binmode(SONG); #para usarios de windows my $read_status = 1; #Esta parte imprime el binario al socket if( defined $chunk && defined $read_status){ undef $chunk; unless( defined $print_status ){ Conectando a tus clientesYa tienes tu servidor listo, pero ahora, ¿cómo conectas a tus clientes? Es realmente muy sencillo. Si estas usando Winamp todo lo que tienes que hacer es ir a Play->Location y poner: http://localhost:8000
Aquí debes de cambiar "localhost" por el ip de tu computadora si quieres conectarte remotamente, y si usaste otro puerto lo debes de poner en vez de 8000. Lo mismo haces con cualquier player de mp3 como el xmms. Preguntas Frecuentes¿Cuántos clientes a la vez puedo tener conectados? En realidad todo depende de tu ancho de banda. Recuerda que cada cliente que se conecta usa ancho de banda, así que debes de calcular para que no tengas clientes que puedan usar tan poco ancho de banda que les sería imposible bajar el mp3.
Si. Muchos de tus clientes podrían tener bastantes problemas al conectar debido a esto.
No. Desgraciadamente es necesario que tengas un ip único para que tu computadora pueda ser accesada.
|
||||||||||||||||||||||||
|
|||||||||||||||||||||||||