Mie Sep 10, 2008 1:41 pm
|
|
|
| Problemas con socket receptor de Perl y GUI |
|
|
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");
}
} |
|
|
|
|

Mie Sep 10, 2008 5:05 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
|
|
|
|
|
| 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? |
|
Mie Sep 10, 2008 6:30 pm
|
|
|
| Problemas con socket receptor de Perl y GUI |
|
|
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í. |
|

Jue Sep 11, 2008 7:36 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
|
|
|
|
|
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). |
|

Sab Sep 13, 2008 6:09 am
|
|
|
|
|
|
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 |
|
|
Sab Sep 13, 2008 6:12 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4239
Ubicación: Valladolid, España
|
|
|
|
|
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". |
|
Powered by phpBB © 2001, 2005 phpBB Group
|