Quiero implementar un cliente-servidor que se comunique por un socket. Tiene que tener la siguiente funcionalidad:
1. cuando el cliente se conecta, el servidor visualiza el mensaje 'Nuevo Cliente conectado!' y le envía un mensaje al cliente '¡¡Conexión establecida con el servidor!!', el cliente lo visualiza en su pantalla.
2. lo que quiero es que el servidor siga a la espera de nuevas comunicaciones (que no se salga a consola) y que el cliente pregunte si quiere cerrar la conexión. En caso afirmativo salimos a la consola, en caso negativo que no haga nada.
Este es el código que tengo, el cliente se queda bloqueado y no muestra el mensaje que el servidor ha enviado:
SERVIDOR
Using perl Syntax Highlighting
- #!/usr/bin/perl -w
- #servidor
- use IO::Socket;
- system ("title SERVIDOR 4.1a");
- $puerto = 9000;
- $protocolo="tcp";
- $servidor = IO::Socket::INET->new(
- Proto => $protocolo,
- LocalPort => $puerto,
- Listen => 1,
- Reuse => 1,
- );
- die "No puedo configurar el Servidor" unless $servidor;
- system("cls");
- system ("color a");
- print "\n";
- print scalar(localtime); print "\n\n";
- print "[Servidor INICIADO]\n\n";
- print "Puerto de comunicaciones: $puerto \n\n";
- print "Esperando conexiones remotas...\n\n";
- # $|++;
- $mensaje="Conexion establecida con el servidor!!";
- while ($remoto = $servidor->accept() ) #se mantiene a la espera de conexiones cliente
- {
- $remoto->autoflush(1);
- #activar el autoflush(), para que el envío de mensajes sea por cada línea, y no por bloques.
- #para cada conexión entrante muestro en el servidor un mensaje y envío un comunicado al cliente
- print "\nNuevo Cliente conectado!\n";
- print $remoto $mensaje;
- }
- close $servidor;
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4
CLIENTE
Using perl Syntax Highlighting
- #!/usr/bin/perl -w
- #CLIENTE MUY SENCILLO
- use IO::Socket;
- system ("title CLIENTE 4.1a");
- $contador=0;
- $puerto = 9000;
- $protocolo="tcp";
- $cliente = IO::Socket::INET->new(
- Proto => $protocolo,
- PeerAddr => "localhost",
- PeerPort => $puerto,
- Reuse => 1,
- );
- die "problema" unless $cliente;
- system ("cls");
- print scalar(localtime); print "\n\n";
- print "[Cliente INICIADO]\n\n";
- print "Puerto de comunicaciones: $puerto \n\n";
- #recibiendo el mensaje del servidor y lo muestro en pantalla
- $mensaje = <$cliente>;
- print "$mensaje"; #mostrándolo en pantalla
- print "\n";
- while ($contador==0)
- {
- print "Desea salir (S/N)?: ";
- $salida= <STDIN>;
- chop($salida);
- if ($salida eq "S" or $salida eq "s")
- {
- $contador=1;
- print "Ha decidido cerrar la comunicacion: \n";
- close $cliente or die "close: $!";
- print "\nSOCKET Cerrado\n";
- print "Pulse INTRO para continuar";
- $nada=<STDIN>;
- exit;
- }
- else
- {
- $contador=0;
- print "OK. Sigue conectado al servidor \n";
- }
- }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
¡¡¡Saludos!!!