Dom May 11, 2008 7:18 pm
|
|
|
| IO::Socket emisor y receptor de un mensaje |
|
|
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í:
| Perl: | #!/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;
} |
Al ejecutarlo mediante perl p2.pl en la consola solo se observa:
| Código: |
| Server=IO::Socket::INET=GLOB(0X198be08) |
Del lado del emisor tengo el código:
| Perl: | #!/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; |
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? |
|
|
|

Lun May 12, 2008 2:22 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3539
Ubicación: Valladolid, España
|
|
|
|
|
Estos ejemplos me funcionan:
| Perl: | #!/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;
}
|
| Perl: | #!/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; |
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... |
|

Lun May 12, 2008 5:27 am
|
|
|
| Modificar receptor IO::Socket para enviar información |
|
|
explorer, saludos
Modifiqué el receptor de la siguiente manera: p2.pl
| Perl: | #!/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;
} |
y p1.pl como:
| Perl: | #!/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; |
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? |
|

Lun May 12, 2008 6:09 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3539
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|
Lun May 12, 2008 10:34 am
|
|
|
|
|
|
| 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. |
|
Lun May 12, 2008 10:37 am
|
|
|
|
|
|
| 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. |
|
Lun May 12, 2008 10:47 am
|
|
|
|
|
|
| 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. |
|
Lun May 12, 2008 11:55 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 3539
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|
Lun May 12, 2008 9:24 pm
|
|
|
| GUI Para mostrar informacion recbida via socket |
|
|
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. |
|

Mar May 13, 2008 2:10 am
|
 |
explorer
Moderador

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

Mar May 13, 2008 5:18 am
|
|
|
| Problema para mostrar información recibida del socket en GUI |
|
|
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.
| 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;
} |
|
|

Mar May 13, 2008 5:31 am
|
|
|
| Problema para mostrar información recibida del socket en GUI |
|
|
| 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. |
|
Mar May 13, 2008 11:18 am
|
 |
explorer
Moderador

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

Mie May 14, 2008 5:00 am
|
|
|
| Problema con el envío y recepción a traves de socket |
|
|
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:
| Perl: | #!/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;
} |
En el otro extremo Receptor- Emisor el código es:
| Perl: | #!/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;
} |
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. |
|

Jue May 15, 2008 7:22 am
|
|
|
| Problema entre socket Java y socket Perl |
|
|
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 |
|
Powered by phpBB © 2001, 2005 phpBB Group
|