• Publicidad

IO::Socket emisor y receptor de un mensaje

¿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.

Problema para mostrar información recibida del socket en GUI

Notapor informatico95 » 2008-05-13 06:18 @304

Saludos.

Investigué y construí con el módulo Tk una ventana con una etiqueta o label y dos botones aceptar y cancelar.

En la etiqueta recibiré lo que reciba el socket y lo mostraré en la ventana. El problema es que el socket recibe la información y la muestra en la pantalla negra del MS-DOS y no en la ventana.

De hecho la ventana no se despliega. No se observa y no veo cual puede ser el problema.

Este es el código del receptor modificado para que muestre información recibida por el socket en la ventana.

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.004 segundos, usando GeSHi 1.0.8.4
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Publicidad

Problema para mostrar información recibida del socket en GUI

Notapor informatico95 » 2008-05-13 06:31 @313

Pasó algo raro; como le daba guardar al script y veía que no actualizaba con respecto a lo que modificaba en el script, decidí darle guardar cómo y sobreescribir el script con el mismo nombre. Pues funcionó y ya muestra lo que envío en la ventana, con los dos botones. Ahora solo me falta que cuando presione aceptar mande un 1 y cuando presione cancelar mande 0 al socket emisor.
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor explorer » 2008-05-13 12:18 @554

Yo veo problemas... tienes que mezclar la multitarea de un programa gráfico con la espera de la conexión de un cliente, que no sabes cuándo ocurrirá.

Para hacerlo bien habría que usar POE.

De otra forma... podrías haber la conexión en modo no bloqueante, y así el programa no quedaría congelado mientras espera la llegada de la conexión del cliente.
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

Problema con el envío y recepción a traves de socket

Notapor informatico95 » 2008-05-14 06:00 @292

Saludos

Estoy finalizando trabajo con socket. Envío una palabra a través del socket en una máquina y es recibido por el otro socket en la otra máquina.

La palabra recibida es mostrada en una ventana con dos botones. Aceptar y Cancelar. Hasta aquí todo bien pero deseo que cuando presione el botón Aceptar mande un 1 a través del socket al otro socket de la otra máquina y si presiona el botón Cancelar mande un 0 a través del socket a la otra máquina.

Coloqué una bandera o un mensaje para ver si estaba mandando el valor 1 o 0 y la imprime pero en el otro extremo no se recibe el 1 o el 0. Necesito ayuda con eso.

El código del emisor-receptor en un extremo es el siguiente:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl-w
use IO::Socket;

#Aqui emite palabra

$sock=IO::Socket::INET->new(PeerAddr=>"10.0.0.16",PeerPort=>5800,Proto=>'tcp',Timeout=>5);
die "problema" unless $sock;
chomp($msg=<STDIN>);
print $sock $msg;
close $sock;

#A partir de aqui debe recibir y no lo hace

$port=5800;
$maxcliente=1;

$server=IO::Socket::INET->new(proto=>'tcp',LocalPort=>$port,Listen=>$maxcliente,Reuse=>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
}
close $server;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


En el otro extremo Receptor- Emisor el código es:
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!!");

#Aqui recibe sin problema
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;

    #En el command se programa el envio del 1 y el 0

    $mw->Button(-text=>Aceptar,-command=>sub{$sock1=IO::Socket::INET->new(PeerAddr=>"10.0.0.15",PeerPort=>"5800",Proto=>"tcp",Reuse=>1);
    die "problema" unless $sock1;$msg=1;print $sock1 $msg;print "Enviando 1";close $sock1;},-width=>10,-height=>1.90)->pack(-side=>'left',-padx=>15);
   
    $mw->Button(-text=>Cancelar,-command=>sub{$sock2=IO::Socket::INET->new(PeerAddr=>"10.0.0.15",PeerPort=>"5800",Proto=>"tcp",Reuse=>1);
    die "problema" unless $sock2;$msg=0;print $sock2 $msg;print "Enviando 0";close $sock2;exit},-width=>10,-height=>1.90)->pack(-side=>'left',-padx=>15);
   
MainLoop;
  }
  close $server;
}
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


La idea es que en un extremo se reciba información pero también se envíe información y en el otro extremo se envíe información pero también se reciba información.

Agradezco ayuda al respecto.
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Problema entre socket Java y socket Perl

Notapor informatico95 » 2008-05-15 08:22 @390

Saludo

Logré hacer funcionar el socket en los dos sentidos y estoy probando transmitiendo desde el socket en Java y recibiendo con el socket en Perl. Pero cuando el socket de Perl recibe, recibe con algo de basura.

Ejemplo:

Envío la palabra julio con el socket de Java y recibo con el socket de Perl esto: 1/4& @w@julio.

¿Cómo puedo hacer para limpiar la basura en Perl y quedarme solo con la palabra julio?

Agradezco ayuda
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Anterior

Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 2 invitados