• Publicidad

Problemas con socket receptor de Perl y GUI

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Problemas con socket receptor de Perl y GUI

Notapor informatico95 » 2008-09-10 14:41 @653

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
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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;
}
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Emisor de Java
Sintáxis: [ Descargar ] [ Ocultar ]
Using java Syntax Highlighting
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");
                }
         }
Coloreado en 0.012 segundos, usando GeSHi 1.0.8.4
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Publicidad

Notapor explorer » 2008-09-10 18:05 @795

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?
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

Problemas con socket receptor de Perl y GUI

Notapor informatico95 » 2008-09-10 19:30 @854

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.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print $line;
Label(-text=>"$line")->pack();
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿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í.
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor explorer » 2008-09-11 20:36 @900

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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/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__
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
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: Seleccionar todo
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).
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

Notapor informatico95 » 2008-09-13 07:09 @340

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: Seleccionar todo
Uncaught exception from user code:
IO::Socket::INET:               ............ Propagated at receptor.pl line 18.
at receptor.pl line 18
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor explorer » 2008-09-13 07:12 @342

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".
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 Intermedio

¿Quién está conectado?

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