• Publicidad

SOCKET sencillo

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

SOCKET básico

Notapor jcarranza » 2010-04-21 04:04 @211

¡¡Hola!!

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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2.  
  3. #servidor
  4.  
  5. use IO::Socket;
  6. system ("title SERVIDOR 4.1a");
  7.  
  8. $puerto = 9000;
  9. $protocolo="tcp";
  10.  
  11. $servidor = IO::Socket::INET->new(
  12.     Proto       => $protocolo,
  13.     LocalPort   => $puerto,
  14.     Listen      =>  1,
  15.     Reuse       =>  1,
  16. );
  17.  
  18. die "No puedo configurar el Servidor" unless $servidor;
  19.  
  20. system("cls");
  21. system ("color a");
  22.  
  23. print "\n";
  24. print scalar(localtime); print "\n\n";
  25. print "[Servidor INICIADO]\n\n";
  26. print "Puerto de comunicaciones: $puerto \n\n";
  27. print "Esperando conexiones remotas...\n\n";
  28. # $|++;
  29.  
  30.  
  31. $mensaje="Conexion establecida con el servidor!!";
  32.  
  33. while ($remoto = $servidor->accept() ) #se mantiene a la espera de conexiones cliente
  34. {
  35.     $remoto->autoflush(1);
  36.         #activar el autoflush(), para que el envío de mensajes sea por cada línea, y no por bloques.
  37.        
  38.         #para cada conexión entrante muestro en el servidor un mensaje y envío un comunicado al cliente
  39.     print "\nNuevo Cliente conectado!\n";
  40.         print $remoto $mensaje;
  41. }
  42.  
  43.  
  44. close $servidor;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4



CLIENTE
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. #CLIENTE MUY SENCILLO
  3.  
  4. use IO::Socket;
  5. system ("title CLIENTE 4.1a");
  6.  
  7. $contador=0;
  8. $puerto = 9000;
  9. $protocolo="tcp";
  10.  
  11. $cliente = IO::Socket::INET->new(
  12.     Proto       => $protocolo,
  13.     PeerAddr    => "localhost",
  14.     PeerPort    =>  $puerto,
  15.     Reuse       =>  1,
  16.  
  17. );
  18.  
  19. die "problema" unless $cliente;
  20.  
  21. system ("cls");
  22.  
  23. print scalar(localtime); print "\n\n";
  24. print "[Cliente INICIADO]\n\n";
  25. print "Puerto de comunicaciones: $puerto \n\n";
  26.  
  27. #recibiendo el mensaje del servidor y lo muestro en pantalla
  28. $mensaje = <$cliente>;
  29. print "$mensaje";  #mostrándolo en pantalla
  30. print "\n";
  31.  
  32.  
  33.  
  34. while ($contador==0)
  35. {
  36.         print "Desea salir (S/N)?: ";
  37.         $salida= <STDIN>;
  38.         chop($salida);
  39.  
  40.         if ($salida eq "S" or $salida eq "s")
  41.         {
  42.                 $contador=1;
  43.                 print "Ha decidido cerrar la comunicacion: \n";
  44.                 close $cliente or die "close: $!";
  45.                 print "\nSOCKET Cerrado\n";
  46.                 print "Pulse INTRO para continuar";
  47.                 $nada=<STDIN>;
  48.                 exit;
  49.         }
  50.        
  51.         else
  52.         {
  53.                 $contador=0;
  54.                 print "OK. Sigue conectado al servidor \n";
  55.                
  56.         }
  57.  
  58. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4



¡¡¡Saludos!!!
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250

Publicidad

Re: SOCKET básico

Notapor explorer » 2010-04-21 05:02 @251

Creo que en el cliente falta por desactivar el caché del buffer de salida, y además, en el bucle del cliente no está la sentencia de lectura de lo que llega del servidor.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: SOCKET básico

Notapor jcarranza » 2010-04-21 06:03 @293

¿Cómo se activa la caché?

Por otro lado, en el cliente he puesto este código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#recibiendo el mensaje del servidor y lo muestro en pantalla
$mensaje = <$cliente>;
print "$mensaje";  #mostrándolo en pantalla
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿No basta con esto para ver en pantalla el mensaje enviado por el servidor?

Me harías un favor si me indicas cómo quedaría el código final.
Muchas gracias por tu ayuda, llevo unos días programando en Perl y ¡¡estoy algo verde!!
jcarranza
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2010-04-20 05:00 @250

Re: SOCKET básico

Notapor explorer » 2010-04-21 06:28 @311

La caché está activada por defecto. Para quitarla, basta con hacer $|++, como tienes en el código anterior.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 25 invitados

cron