2010-10-09 6 views
4

J'ai un programme client-serveur Perl. Je veux envoyer un message stocké dans un tableau au serveur.Comment puis-je envoyer un tableau dans un programme de serveur client en Perl?

Code Serveur:

use IO::Socket::INET; 

# Creating a a new socket 
$socket=new IO::Socket::INET->new(LocalPort=>5000,Proto=>'udp'); 

print "\nUDPServer Waiting for client on port 5000"; 

while(1) 
{ 
    $socket->recv($recieved_data,1024); 
    $peer_address = $socket->peerhost(); 
    $peer_port = $socket->peerport(); 
    print "\n($peer_address , $peer_port) said : $recieved_data"; 
} 

Code client ::

use IO::Socket::INET; 

# Create a new socket 
$socket=new IO::Socket::INET->new(PeerAddr=>'127.0.0.1',PeerPort=>5000,Proto=>'udp'); 

@message_array = ("message", 120, "sample"); 
$socket->send(@message_array); 

En côté serveur j'ai changé comme,

$socket->recv(@recieved_data,1024); 

Mais je reçois une erreur comme ça,

UDPServer Waiting for client on port 5000usage: $sock->recv(BUF, LEN [, FLAGS]) at udp_server.pl line 17 

Comment envoyer un tableau et le faire imprimer ou afficher côté serveur.

Répondre

4

Vous devez sérialiser les données. Vous envoyez le bloc de données sérialisé sur le fil, puis le désérialisez.

Il existe de nombreuses options pour cela. Les fauteurs indonésien Perl a récemment fait a comparison of serialization modules

Perl est livré avec Storable, qui peut fonctionner très bien même si vous devez veiller à ce que le module n'a pas changé d'une certaine façon pour que la sérialisation d'une version fonctionne avec une autre version.

Il existe des formats de données tels que YAML ou JSON qui pourraient être meilleurs car ils ne dépendent pas des versions de module. Les deux peuvent gérer des structures de données complexes, bien que YAML puisse gérer des objets Perl et que JSON ne puisse pas (bien que JSYNC puisse le faire). Chaque option a des compromis différents.

2

Vous ne pouvez pas envoyer un tableau directement. Sérialiser votre tableau avec pack/unpack si vous avez des chaînes simples ou utilisez Storable pour une solution plus générale.

3

send/recv dans IO :: Socket :: INET sont simplement héritées de IO :: Socket. From POD:

IO :: Socket :: INET fournit une interface objet pour créer et utiliser des prises de courant dans le domaine AF_INET. Il est construit sur l'interface IO :: Socket et hérite de toutes les méthodes définies par IO :: Socket.

IO::Socket in turn a front end autour des fonctions Perl intégrées des mêmes noms. Comme on peut le voir sur send (http://search.cpan.org/~jesse/perl-5.12.2/pod/perlfunc.pod).

send SOCKET,MSG,FLAGS 

    Sends a message on a socket. 
    Attempts to send the **scalar** MSG to the SOCKET filehandle. 

Ces fonctions ne prennent explicitement un message scalaire , vous devez donc en quelque sorte serialize le tableau dans un scalaire.

Vous pouvez soit utiliser votre propre protocole de sérialisation (joindre une virgule si les membres du tableau sont garantis de ne pas avoir de virgules à l'intérieur des chaînes, par exemple); ou utiliser des emballages; ou utilisez Data::Dumper->Dump ou Storable ou tout autre package de sérialisation que vous préférez. Si vous souhaitez comparer différentes méthodes, vous pouvez rechercher "perl serialize".

Questions connexes