2010-05-13 5 views
4

Dans les sockets, j'ai écrit le programme du serveur client. J'ai d'abord essayé d'envoyer la chaîne normale parmi eux, ça envoie bien. Après cela, j'ai essayé d'envoyer les valeurs de hachage et de tableau du client au serveur et du serveur au client. Quand j'imprime les valeurs en utilisant Dumper, cela me donne seulement la valeur de référence. Que dois-je faire pour obtenir les valeurs réelles dans le serveur client?Comment puis-je partager des structures de données Perl via un socket?

programme serveur:

use IO::Socket; 
use strict; 
use warnings; 

my %hash = ("name" => "pavunkumar " , "age" => 20) ; 
my $new = \%hash ; 
#Turn on System variable for Buffering output 
$| = 1; 
# Creating a a new socket 
my $socket= 
IO::Socket::INET->new(LocalPort=>5000,Proto=>'tcp',Localhost => 
     'localhost','Listen' => 5 , 'Reuse' => 1); 
die "could not create $! \n" unless ($socket); 
     print "\nUDPServer Waiting port 5000\n"; 
     my $new_sock = $socket->accept(); 
     my $host = $new_sock->peerhost(); 
     while(<$new_sock>) 
     { 
     #my $line = <$new_sock>; 
     print Dumper "$host $_"; 
     print $new_sock $new . "\n"; 
     } 
     print "$host is closed \n" ; 

programme client

use IO::Socket;        
use Data::Dumper ;        
use warnings ;         
use strict ;         

my %hash = ("file" =>"log.txt" , size => "1000kb") ; 

my $ref = \%hash ; 


# This client for connecting the specified below address and port 
# INET function will create the socket file and establish the connection with 
# server 

my $port = shift || 5000 ; 
my $host = shift || 'localhost'; 
my $recv_data ; 
my $send_data; 
my $socket = new IO::Socket::INET (
            PeerAddr => $host , 
            PeerPort => $port , 
            Proto => 'tcp',) 

or die "Couldn't connect to Server\n"; 
while (1) 
{ 
     my $line = <stdin> ; 
     print $socket $ref."\n"; 
     if ($line = <$socket>) 
     { 
       print Dumper $line ; 
     } 
     else 
     { 
       print "Server is closed \n"; 
       last ; 
     } 

} 

J'ai donné mon exemple de programme sur ce que je fais. Quelqu'un peut-il me dire ce que je fais erroné dans ce code? Et ce que je dois faire pour accéder aux valeurs de hachage?

Répondre

8

Quand vous dites

print $ref; 

, vous êtes en partie des instructions Perl pour transformer $ref en une chaîne (car uniquement les chaînes peuvent être print ed). Il s'avère que les références ne deviennent pas des chaînes très utiles par défaut.

Vous devez transformer $ref en une chaîne que vous pouvez envoyer sur le réseau, puis décoder de l'autre côté pour récupérer les données. Ce processus est appelé "sérialisation". La sortie de Data::Dumper est en fait une sérialisation valide de ses arguments, mais le module de sérialisation de base de Perl est Storable.

de la procédure, vous pouvez dire [1]

use Storable qw(nfreeze); # nfreeze rather than freeze because 
          # we want a network-portable string 
... 
print nfreeze($ref); 

d'un côté et

use Storable qw(thaw); 
... 
my $ref = thaw($line); 

sur l'autre.

Il existe également une interface OO; lisez la documentation Storable pour plus d'informations.

[1]: Notez les yaddayaddas. C'est un code incomplet qui illustre simplement les différences clés de votre code.

+2

Bonne réponse. Il est important de souligner que vous avez utilisé 'nfreeze' (par opposition à' freeze'), ce qui permet de rendre les données encodées Storable plus portables. – daotoad

+0

Merci et terminé. – darch

5

Le problème est que vous envoyez des références aux données, pas les données elles-mêmes. Vous devez sérialiser les données en quelque sorte. JSON est un moyen très facile de le faire. Il y a également YAML.

Questions connexes