Как я могу отправить массив в клиент-серверной программе на Perl? - PullRequest
4 голосов
/ 09 октября 2010

У меня есть клиент-серверная программа 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 ]

4 голосов
/ 09 октября 2010

Вы должны сериализовать данные. Вы отправляете сериализованный кусок данных по сети, а затем десериализуете его.

Есть много вариантов для этого. Недавно разработчики Perl из Индонезии провели сравнение модулей сериализации

Perl поставляется с Storable , который может прекрасно работать, хотя вы должны быть осторожны, чтобы модуль не изменился каким-либо образом, чтобы сериализация одной версии работала с другой версией.

Существуют форматы данных, такие как YAML или JSON , которые могут быть лучше, поскольку они не зависят от версий модуля. Оба могут обрабатывать сложные структуры данных, хотя YAML может работать с объектами Perl, а JSON - (хотя JSYNC может). Каждый вариант имеет различные компромиссы.

3 голосов
/ 09 октября 2010

send / recv в IO :: Socket :: INET просто унаследованы от IO :: Socket. Из POD :

IO :: Socket :: INET предоставляет объектный интерфейс для создания и использования сокетов в домене AF_INET.Он построен на интерфейсе IO :: Socket и наследует все методы, определенные IO :: Socket.

IO :: Socket, в свою очередь, передний конец вокруг встроенных в Perl функций с такими же именами.

Как мы видим для 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. 

Эти функции явно принимают только скалярное сообщение, поэтому вам нужно каким-то образом сериализовать массив в скаляр.

Вы можете использовать свой собственный протокол сериализации (присоединяйте запятую к строке, если гарантируется, что члены массива не имеют запятых внутри строк, как один из примеров);или использовать упаковки;или используйте Data::Dumper->Dump или Storable или любой другой пакет сериализации, который вы предпочитаете.Если вы хотите сравнить разные методы, вы можете исследовать «perl serialize».

2 голосов
/ 09 октября 2010

Вы не можете отправить массив напрямую. Сериализуйте ваш массив с pack/unpack, если у вас есть простые строки или используйте Storable для более общего решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...