Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Problemas con socket receptor de Perl y GUI

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio
Mensaje Mie Sep 10, 2008 1:41 pm
informatico95
Perlero Nuevo
Perlero Nuevo
Registrado: 11 May 2008
Mensajes: 18
Problemas con socket receptor de Perl y GUI Responder citando

Estoy tratando de transmitir con el socket de Java al socket de Perl.

El socket de Perl recibe la información enviada con el socket de Java con algo de basura y la muestra en la ventana negra del MSDOS pero cuando se intenta imprimir en una ventana (GUI) la información se embasura completamente y lo que muestra es totalmente distinto a lo enviado. Envío código para que lo corran y vean que es lo está pasando. ¿Cómo puedo resolver eso?

Receptor de perl
Perl:
#!/usr/bin/perl -w
use Tk;
use IO::Socket;
use Net::hostent;

my $mw=MainWindow->new;
$mw->minsize(200,100);
$mw->title("AVISO!!");
my $server=IO::Socket::INET->new(Proto=>"tcp",LocalPort=>"5800",Listen=>"1");

#die "no puede configurar servidor" unless $server;
#print "Server $0 aceptando clientes";

while($cliente=$server->accept()){
  $cliente->autoflush(1);
  while(defined($line=<$cliente>)){
    #print $line;
   
    $mw->Label(-text=>$line)->pack;
    $mw->Button(-text=>Aceptar,-command=>sub{},-width=>10,-height=>1.90)->pack(-side=>'left',-padx=>15);
    $mw->Button(-text=>Cancelar,-command=>sub{exit},-width=>10,-height=>1.90)->pack(-side=>'left',-padx=>15);
    MainLoop;
  }
  close $server;
}


Emisor de Java
Java:
import java.net.*;
import java.io.*;
class servidor{
       
        public static void main(String args[]){
                try{
               
                Socket conexion=new Socket(args[0],5800);
                ObjectOutputStream salida=new ObjectOutputStream(conexion.getOutputStream());
                salida.flush();
                salida.writeObject("Hola mundo!");
                System.out.println("Hola mundo!");
                salida.flush();
                salida.close();
                conexion.close();
                }
                catch(IOException io){
                        System.out.println("error");
                }
         }
Mensaje Mie Sep 10, 2008 5:05 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

Yo... es que no veo muy bien eso de meter el MainLoop en un bucle... y ¿el Java envía un carácter de fin de línea?
Mensaje Mie Sep 10, 2008 6:30 pm
informatico95
Perlero Nuevo
Perlero Nuevo
Registrado: 11 May 2008
Mensajes: 18
Problemas con socket receptor de Perl y GUI Responder citando

Amigo, el problema está en que quiero imprimir la variable $line en el GUI o ventana de TK y cuando la coloco en la propiedad text de la etiqueta o label no me interpola el valor de la variable sino basura.

Perl:
print $line;
Label(-text=>"$line")->pack();


¿Cómo puedo imprimir el valor de esa variable en la ventana $mw?

Hay otra forma de imprimir el valor de la variable $line en la ventana?

Cuando utilizo print $line me imprime el valor de la variable pero en la ventana negra de MS-DOS y quiero que ese valor se vea en la ventana del GUI (Interfaz Gráfica del Usuario).

Agradezco ayuda. Estoy trancado allí.
Mensaje Jue Sep 11, 2008 7:36 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

Este es un ejemplo, para que veas la diferencia de procesamiento entre Tk y los socket.

Perl:
#!/usr/bin/perl
use strict;
use warnings;
use diagnostics;

## Conexión
use IO::Select;
use IO::Socket;

$|++; # no caché

my $lsn = new IO::Socket::INET(
    Blocking => 0,
    Listen => 1,
    LocalPort => 1234,
    PeerAddr => 'localhost',
);
die if !$lsn;
my $sel = new IO::Select( $lsn );


## Entorno gráfico
use Tk;

my @ojitos = qw[ 0.0 v.v ^.^ ];
my $ojitos = 1;

my $mw = MainWindow->new;
$mw->minsize(300,100);
$mw->title("Recepcion");

my $ETIQUETA = $mw->Label( -text => "Esperando..." );
my $EYES     = $mw->Label( -text => $ojitos[1] );
my $MENSAJE  = $mw->Label( -text => '' );

$ETIQUETA->pack;
$EYES    ->pack;
$MENSAJE ->pack;

# Botón de salida
$mw->Button(
    -text    => 'Salir',
    -command => \&cierra,
    -width   => 10,
    -height  => 1.90,
)->pack();

# Temporizador
$mw->repeat(1000, \&mira);

sub mira {
    $EYES->configure( -text => $ojitos[++$ojitos % 2] );

    # ¿Hay algo qué leer?
    while( my @ready = $sel->can_read(0)) {

        # Para todos los canales abiertos
        foreach my $fh (@ready) {

            # Si es nuestro socket...
            if ($fh == $lsn) {
                my $new = $lsn->accept;         # Aceptamos la conexión
                $sel->add($new);                # Añadimos la conexión al select
                print "Se ha recibido algo\n";
                $ETIQUETA->configure( -text => 'Recibiendo...' );
                $EYES->configure( -text => $ojitos[2] );
            }
            else {
                print "El mensaje: ";

                # Procesamos el socket
                if ( my $linea = <$fh> ) {
                    $linea =~ s/[\r\n]+$//;
                    $MENSAJE->configure( -text => $linea );
                    print "[$linea]\n";
                }

                # Cerramos el canal
                else {
                    print "Canal cerrado\n";
                    $ETIQUETA->configure( -text => 'Cerrando...' );
                    $sel->remove($fh);
                    $fh->close;
                    $EYES->configure( -text => $ojitos[2] );
                    $MENSAJE->configure( -text => '' );
                }
            }
        }
    }
}

sub cierra {
    print "Lo cerramos\n";
    $lsn->close;
    exit;
}

## Programa
MainLoop;

__END__
Debes notar:
* creamos la conexiones socket y select, primero
* luego, el aspecto gráfico
* arrancamos el gestor gráfico, y,
* el temporizador de 1s mira() a ver si hay algo qué leer
* y salimos si el usuario pulsa el botón.

Arrancamos este programa y sale con la indicación de que está esperando.
Desde otra terminal, hacemos un telnet, para probar:
Código:
explorer@portatil:~/Documents/Desarrollo> telnet localhost 1234
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
hola
adios
^]
telnet> close
Connection closed.
Nos conectamos, le enviamos un par de frases, y luego salimos de la sesión.

Fíjate en el detalle: creamos el entorno gráfico y luego, solo modificamos el contenido de las 'label' con el método configure(), para cambiar uno de sus atributos (ver Tk::options).
Mensaje Sab Sep 13, 2008 6:09 am
informatico95
Perlero Nuevo
Perlero Nuevo
Registrado: 11 May 2008
Mensajes: 18
Responder citando

Amigo, al intentar correr el código que me indicaste, con la instrucción C:>perl receptor.pl me genera el siguiente error:

Código:
Uncaught exception from user code:
IO::Socket::INET:               ............ Propagated at receptor.pl line 18.
at receptor.pl line 18
Mensaje Sab Sep 13, 2008 6:12 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
Responder citando

No ha podido abrir un puerto en el 1234. Cámbialo al 5800, como tienes en tu programa.

O quizás no se pueda hacer en tu máquina la opción de "no bloqueante".
Publicar nuevo tema   Responder al tema    Foros de discusión -> Intermedio Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group