Как обрабатывать общение клиент-сервер в Perl? - PullRequest
2 голосов
/ 30 ноября 2011

У меня есть два сценария Perl, которые должны выполнять следующую работу:

Сервер запускается и ожидает подключения клиента.Клиент подключается и мгновенно отправляет файл XML.Сервер читает файл XML и запускает пару потоков.Каждый поток получает сокет $ client в качестве параметра, и как только он закончил, он должен отправить вывод обратно клиенту.Между тем клиент ожидает поступления сообщений, он должен печатать эти сообщения в командной строке.

Теперь моя проблема в том, что я не знаю, как реализовать последнюю часть.Я попытался использовать метод приема, но обе программы застряли, если я это сделаю.

Сторона сервера:

my @threads;
$server = IO::Socket::INET->new(
            Listen => 1,                
            LocalAddr => 'localhost', 
            LocalPort => '8080', 
            Proto => 'tcp'
) or die "Can't crete socket!\n";
$client = $server->accept;
open FILE, ">".$filename or die "Can't open file!\n";
while (<$client>) {
    print FILE $_;  
}
close FILE;

# READ FILE AND DO SOME OTHER STUFFS
push @threads, threads ->create(\&subroutine1, $parameters, $client);
# OTHER STUFFS
push @threads, threads ->create(\&subroutine2, $parameters, $client);
# MORE THREADS...

sub subroutine1 {
    my @pars= @_;
    my $parameters = $pars[0];
    my $client = $pars[1];
    my $sub1 = `perl other_script.pl $parameters`;
    $client->send($mem);
}

Сторона клиента:

my $server = IO::Socket::INET->new(
    PeerAddr => 'localhost',
    PeerPort => '8080',
    Proto => 'tcp'
) or die "Can't create client socket!\n";
open FILE, $filename;
while (<FILE>) {
    print $server $_;   
}
close FILE;
# HOW DO I READ INFORMATIONS?
$server->close();

1 Ответ

2 голосов
/ 30 ноября 2011

Вы не можете поместить отправляемую часть в дочерние / рабочие потоки, она будет перемешана.

В: Почему многопоточная курица перешла дорогу?

A: другой в сторону. Чтобы получить

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

Вы читаете с помощью функции recv , также доступной как метод в IO::Socket.

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