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

IO::Socket emisor y receptor de un mensaje

Notapor informatico95 » 2008-05-11 20:18 @888

Amigos, estoy intentando crear un script que me reciba un string suministrado por otro script en otra máquina. Para el script receptor he colocado el siguiente código tomado de un ejemplo de aquí:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use IO::Socket;
use Net::hostent;

$server=IO::Socket::INET->new(Proto=>'tcp',LocalPort=>5800,Listen=>1,Reuse=>1);
print "server=$server\n";

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

while($cliente=$server->accept()){
    $cliente->autoflush(1);
    print "cliente=$cliente";
    while(defined($line=<$cliente>)){
        print $cliente $line
    }
    close $cliente;
}
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


Al ejecutarlo mediante perl p2.pl en la consola solo se observa:

Código: Seleccionar todo
Server=IO::Socket::INET=GLOB(0X198be08)


Del lado del emisor tengo el código:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl-w
use IO::Socket;
$sock=IO::Socket::INET->new(PeerAddr=>"10.0.0.16",PeerPort=>5800,Proto=>'tcp',Timeout=>1);
die "problema" unless $sock;
chomp($msg=<STDIN>);
print $sock $msg;
print "Hola portatil";
close $sock;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Al ejecutarlo en el terminal del otro PC mediante el comando p1.pl se observa en la consola el valor centinela Hola Portatil pero sin embargo en el receptor no se recibe nada.

¿Podrían ayudarme a corregir fallas?
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Publicidad

Notapor explorer » 2008-05-12 03:22 @182

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

my $server = IO::Socket::INET->new(
    Proto       => 'tcp',
    LocalPort   =>  5800,
    Listen      =>  1,
    Reuse       =>  1,
);

die "No puedo configurar servidor" unless $server;
print "Server $0 aceptando clientes...\n";

$|++;

while( $cliente = $server->accept() ) {
    $cliente->autoflush(1);
    print "Conectado cliente\n";
    while(  defined( $line = <$cliente> )  ) {
        print $line;
    }
    close $cliente;
}
 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use IO::Socket;
$sock = IO::Socket::INET->new(
    PeerAddr    => "localhost",
    PeerPort    =>  5800,
    Proto       => 'tcp',
    Timeout     =>  1,
);
die "problema" unless $sock;

print "Introduce texto para mandar: ";
$msg = <STDIN>;
print $sock $msg;
close $sock;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo que le faltaba al tuyo era que estabas reenviando lo recibido por el cliente a él mismo, pero el cliente no estaba preparado para recibir nada. En el mío, lo muestro en la terminal del propio servidor. Y otro detalle: se agregó un $|++ para hacer el autoflush en la salida de los mensajes del servidor a la consola.

En los ejemplos que te pongo, he quitado aquello que me parecía superfluo para una simple comunicación entre el cliente y el servidor.

Pruebalos a ver...
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

Modificar receptor IO::Socket para enviar información

Notapor informatico95 » 2008-05-12 06:27 @310

explorer, saludos

Modifiqué el receptor de la siguiente manera: p2.pl
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl -w

use IO::Socket;
use Net::hostent;

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
  }
  close $server;
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y p1.pl como:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl-w
use IO::Socket;
$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;
print "Hola portatil";
close $sock;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y está recibiendo el mensaje que envío. Me tomó todo el día que funcionara pero ya funciona.

Ahora deseo colocar en una ventana con un botón aceptar y cancelar el mensaje recibido en el receptor.

Si se presiona aceptar debe enviarse un valor 1 del receptor al emisor y si se presiona cancelar se enviará un valor 0 del receptor al emisor.

¿Cómo hago eso?
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor explorer » 2008-05-12 07:09 @340

A ver... varias cosas...

¿Esa ventana está dentro de un programa con un entorno gráfico o se trata de un botón en una página web?

¿Quieres enviar un '1' -dígito- o un '0x01' -binario-? Son cosas muy distintas... un '1' como dígito equivale a 49 binario en el sistema ascii.
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-05-12 11:34 @523

Quiero que cuando reciba el mensaje, ese mensaje sea mostrado en una ventana que tendrá dos botones: aceptar y cancelar. Es un GUI. Una Interfaz Gráfica del usuario. No una página web. Y una vez presionado Aceptar debería enviar un valor entero 1 o un valor entero 0 en caso de presionar Cancelar. Del otro lado estaré esperando recibir un string con el socket de Java, para luego hacer una comparación para abortar o no el programa emisor.
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor informatico95 » 2008-05-12 11:37 @526

Por lo de Java no te preocupes que yo me defiendo allí. Lo que quiero es que el mensaje que está llegando del socket de Java al socket de Perl pueda ser colocado en esa ventana con esos dos botones y envíe 1 si presiono el botón aceptar al socket de Java o 0 si presiono el botón cancelar al socket de Java.
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor informatico95 » 2008-05-12 11:47 @533

Al principio lo voy a probar en el emisor con el socket de Perl y en el receptor con el socket de Perl y luego lo pruebo en el emisor con el socket de Java. Ya hice pruebas y el socket receptor de Perl recibe tanto con el socket emisor de Perl como con el socket emisor de Java. Creí que no se podía hacer eso pero fíjate si se puede. Lo que averigua uno investigando y probando.
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor explorer » 2008-05-12 12:55 @580

Ese es el efecto de los socket: independiza la comunicación del sistema físico de cada extremo. Y también independiza el sistema lógico o software, siempre y cuando cada extremo esté de acuerdo en qué debe recibir y/o enviar.

Vamos, lo que llamamos protocolo.
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

GUI Para mostrar informacion recbida via socket

Notapor informatico95 » 2008-05-12 22:24 @975

Explorer no me respondiste esta pregunta

Quiero que cuando reciba el mensaje, ese mensaje sea mostrado en una ventana que tendrá dos botones: aceptar y cancelar. Es un GUI. Una Interfaz Gráfica del usuario. No una página web. Y una vez presionado Aceptar debería enviar un valor entero 1 o un valor entero 0 en caso de presionar Cancelar. Del otro lado estaré esperando recibir un string con el socket de Java, para luego hacer una comparación para abortar o no el programa emisor.
informatico95
Perlero nuevo
Perlero nuevo
 
Mensajes: 18
Registrado: 2008-05-11 13:41 @612

Notapor explorer » 2008-05-13 03:10 @174

Pero eso depende del GUI que elijas.

Lo más sencillo es que cuando el usuario pulse un botón, ejecutes un script cuya misión es solo enviar ese dígito al servidor. Y terminar, para volver el control al usuario. Vamos, ejecutar un Perl desde dentro de tu programa gráfico.
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

Siguiente

Volver a Intermedio

¿Quién está conectado?

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