Tengo una comunicación cliente-servidor a través de un SOCKET. Lo que hace es que el cliente envía un string y el servidor lo transforma convirtiendo las mayúsculas a minúsculas y viceversa para acto seguido devolver el resultado al cliente. Una vez acabado el proceso, el servidor se queda a la espera de nuevos clientes.
Lo que me ocurre es que cada vez que inserto un nuevo string, éste se me acumula en memoria y a partir del segundo intento (2º cliente) el cliente no muestra el string correcto que tiene que devolver. Lo que tengo que hacer es inicializar la variable que hay en el servidor pero ¿cómo lo hago?.
Aquí les dejo mi código:
SERVIDOR
Using perl Syntax Highlighting
- #!/usr/bin/perl -w
- #servidor
- use IO::Socket;
- system ("title SERVIDOR 4.1b");
- $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";
- $|++;
- 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.
- system("cls");
- print "\nNuevo Cliente conectado!\n";
- print "\a"; #beep del sistema
- while($datos_cliente = <$remoto> )
- {
- print "Cadena recibida: $datos_cliente";
- #convertimos la cadena:
- for (split//,$datos_cliente)
- { # para cada cadena
- if (/[[:alpha:]]/)
- { # si es carácter alfabético (en iso-8859-1)
- $_ ^= chr 0x20; # invertimos el bit 6, ya que hay una diferencia
- # de 32 caracteres entre las mayúsculas y las minúsculas
- }
- $datos_cliente2 .= $_; #guardamos el resultado en una variable
- #$|=1;
- }
- print "Cadena Convertida: $datos_cliente2";
- print "\n\n";
- #enviamos la cadena al cliente
- print $remoto $datos_cliente2;
- }
- }
- continue {
- print "<< Pasando al MODO DE ESPERA >>\n";
- close $remoto;
- }
- #print "\nSOCKET Cerrado\n";
- #print "Pulse INTRO para continuar";
- #$nada=<STDIN>;
- close $servidor;
Coloreado en 0.003 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.1b");
- $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] --> Puerto de comunicaciones: $puerto \n\n";
- system ("color a");
- print "ESTA COMUNICACION SIRVE PARA ENVIAR UNA CADENA AL SERVIDOR Y QUE LA DEVUELVA \nCAMBIANDO LAS MAYUSCULAS A MINUSCULAS Y VICEVERSA \n\n";
- print "Introduce un texto para enviar: ";
- $mensaje = <STDIN>;
- system ("color 7");
- print $cliente $mensaje; #envío el mensaje al servidor a través del socket abierto.
- #recibo el mensaje del servidor y lo muestro en pantalla
- $mensaje_recibido = <$cliente>;
- print "\nCadena Transformada enviada por el servidor: $mensaje_recibido";
- print "\n";
- close $cliente or die "close: $!";
- print "\nSOCKET Cerrado\n";
- print "Pulse INTRO para continuar";
- $nada=<STDIN>;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4