Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > Помогите с логикой работы клиента


Автор: errr 19.9.2007, 20:38
Есть клиент для некого сервера. Который можеть посылать: "4","5","6"

Код клиента:
Код

my $socket = IO::Socket::INET->new("host:port");
my $readers = IO::Select->new();
$readers->add($socket); 
while (1) {
    my @ready = $readers->can_read;
    for my $handle (@ready) {
        if ($handle eq \*STDIN) {
            if (sysread(STDIN,$buffer,BUFSIZE) > 0) {
                     syswrite($socket,$buffer); #вводятся 4 5 6
               }    
         }
        if ($handle eq $socket) {
            if (sysread($socket,$buffer,BUFSIZE) > 0) {
                     Parse($buffer); 
                }
           }
    }
}

sub Parser { #обработчик данных принятых от сервера
    my ($incoming) = @_;
    return 1 if ($incoming==1);
    return 2 if ($incoming==2);
    return 3 if ($incoming==3);
}


Опишу сервер:
Сервер может посылать сообщения: "1","2","3". 
Причем он их посылает как ответ клиенту на его сообщения, так и самостоятельно без действий клиента (допустим, сообщает свой статус).

Вопрос.
Как бы сделать наиболее оптимально следующую вещь: 
Переслать сообщение "4" и потом, в зависимости от ответа сервера, переслать сообщение "5" или "6"

В данный момент у меня сделано примерно так:
Код

#...
        if ($handle eq \*STDIN) {
            if (sysread(STDIN,$buffer,BUFSIZE) > 0) { #вводятся 4 5 6
                     $mode=1 if ($buffer=4);
                     syswrite($socket,$buffer); 
               }    
         }
#...
sub Parser {
    my ($incoming) = @_;
    if ($incoming==1 && $mode=1) {
        $mode = 0;
        syswrite($socket,"6"); #посылается серверу
    }
    return 1 if ($incoming==1);
    return 2 if ($incoming==2);
    return 3 if ($incoming==3);
}

Но в реальной жизни этих функций в десятки раз больше, вот я и думаю, может у того кто занимался подобными проблемами есть какие-то наработки. 
То есть, послать, послать->принять это не проблема, а вот с послать->принять->послать-> уже хуже

Спасибо!

Автор: Nab 20.9.2007, 11:00
Так как я понял вашу проблему, то вам необходимо использовать метод конечных автоматов, ну или машину состояний, каждый по разному называет...

Есть модули на CPAN реализующие такие вещи, также POE построен по похожему принципу, можете с ним ознакомиться, ну а лучше погуглите на словосочетание "метод конечных автоматов"...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)