如何在Perl中的客户端服务器程序中发送数组?

时间:2010-10-09 08:30:53

标签: perl sockets

我有一个Client-Server Perl程序。我想将存储在数组中的消息发送到服务器。

服务器代码:

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";
}

客户端代码::

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);

在服务器端,我改变了,

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

但我收到这样的错误,

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

如何发送数组并将其打印或显示在服务器端。?

3 个答案:

答案 0 :(得分:4)

您必须序列化数据。您通过线路发送序列化的数据块然后反序列化。

有很多选择。印度尼西亚Perl贩子最近做了a comparison of serialization modules

Perl附带Storable,虽然你必须小心模块没有以某种方式改变,以便一个版本的序列化与另一个版本一起工作,但它可以正常工作。

YAMLJSON等数据格式可能更好,因为它们不依赖于模块版本。两者都可以处理复杂的数据结构,虽然YAML可以处理Perl对象而JSON不能(虽然JSYNC可以)。每个选项都有不同的权衡。

答案 1 :(得分:3)

IO :: Socket :: INET中的

send / recv仅从IO :: Socket继承。 From POD

  

IO :: Socket :: INET提供了一个对象接口,用于在AF_INET域中创建和使用套接字。它基于IO :: Socket接口构建,并继承了IO :: Socket定义的所有方法。

IO::Socket in turn a front end围绕内置的相同名称的Perl函数。

我们可以看到sendhttp://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. 

这些函数只显示标量消息,因此您需要以某种方式serialize将数组转换为标量。

您可以使用自己的序列化协议(如果保证数组成员在字符串中没有逗号,则可以使用逗号连接字符串,例如);或使用包装;或使用Data::Dumper->DumpStorable或您喜欢的任何其他序列化包。如果您想比较不同的方法,可以研究“perl serialize”。

答案 2 :(得分:2)

您无法直接发送数组。如果您有简单的字符串,请使用pack/unpack序列化数组,或使用Storable获得更通用的解决方案。