Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нубский вопрос по POE и по ООП в целом 
:(
    Опции темы
tima2fey
Дата 2.9.2011, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.9.2011

Репутация: нет
Всего: нет



Добрый день. В Перле я новичок, а про ООП его часть я вообще молчу, и вот встретил задачу, которую решить своими силами ну никак не получается.
я взял из POE Cookbook код клиента TCP Simple Client-Server with Filter::Reference отсюда http://poe.perl.org/?POE_Cookbook/TCP_Simp...lter::Reference

Код

#!/usr/bin/perl -w
use strict;
use POE;
use POE::Component::Client::TCP;
use POE::Filter::Reference;
my $host   = "localhost";    # The host to test.
my $port   = 11211;
my @values = (2, 3);
POE::Component::Client::TCP->new(
  RemoteAddress => $host,
  RemotePort    => $port,
  Filter        => "POE::Filter::Reference",
  Connected     => sub {
    my $j = "teste";
    print "connected to $host:$port ...\n";
    $_[HEAP]->{server}->put(\@values);
  },
  ConnectError => sub {
    print "could not connect to $host:$port ...\n";
  },
  ServerInput => sub {

    #when the server answer the question
    my ($kernel, $heap, $input) = @_[KERNEL, HEAP, ARG0];
    print "got result from $host:$port ... YAY!\n";

    #print to screen the result
    print $$input. "\n";
  },
);
$poe_kernel->run();
exit 0;



здесь строка "$_[HEAP]->{server}->put(\@values);" посылает на сервер массив @values. И собственно вопрос: как из другой части программы послать на сервер данные
например организовать цикл в котором на сервер будут посылаться пары чисел увеличивающиеся на единицу.
Эта задача очень для меня важна, бьюсь над ней уже неделю. Буду бесконечно благодарен за помощь или хотя бы наводку на решение.

ps если это важно (хотя я сомневаюсь) ОС - дебиан перл 5,1х
PM MAIL   Вверх
sir_nuf_nuf
Дата 2.9.2011, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Первое, на всякий случай - POE и ООП - это совершенно разные вещи.
POE - это фреймворк для асинхронной работы с событиями и сеть.
ООП - методология программирования, совершенно не зависит от POE.


Второе, вам нужно POE или ООП ?  




--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
tima2fey
Дата 2.9.2011, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.9.2011

Репутация: нет
Всего: нет



Я понимаю что это разные вещи.  У меня есть конкретная задача: посылать на сервер данные из других частей программы (например из цикла)

Вопрос выбора средств для посылки информации тоже уже не стоит. По ряду причин был выбран POE.
PM MAIL   Вверх
sir_nuf_nuf
Дата 2.9.2011, 11:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 920
Регистрация: 6.1.2008

Репутация: 14
Всего: 31



Ок.

Тогда так:
Код

#!/usr/bin/perl -w
use strict;
use POE;
use POE::Component::Client::TCP;
use POE::Filter::Reference;
my $host   = "localhost";    # The host to test.
my $port   = 11211;
my @values = (2, 3);
POE::Component::Client::TCP->new(
  RemoteAddress => $host,
  RemotePort    => $port,
  Filter        => "POE::Filter::Reference",
  Connected     => sub {
    my $j = "teste";
    print "connected to $host:$port ...\n";
    for (1 .. 10) {
       # отправить данные на сервер 10 раз подряд
       $_[HEAP]->{server}->put(\@values);
    }
  },
  ConnectError => sub {
    print "could not connect to $host:$port ...\n";
  },
  # сервер вам ответит 10 раз и POE 10 раз вызовет эту функцию
  ServerInput => sub {
    #when the server answer the question
    my ($kernel, $heap, $input) = @_[KERNEL, HEAP, ARG0];
    print "got result from $host:$port ... YAY!\n";
    #print to screen the result
    print $$input. "\n";
  },
);
$poe_kernel->run();
exit 0;



или так:
Код

#!/usr/bin/perl -w
use strict;
use POE;
use POE::Component::Client::TCP;
use POE::Filter::Reference;
my $host   = "localhost";    # The host to test.
my $port   = 11211;
my @values = (2, 3);
POE::Component::Client::TCP->new(
  RemoteAddress => $host,
  RemotePort    => $port,
  Filter        => "POE::Filter::Reference",
  Connected     => sub {
    my $j = "teste";
    print "connected to $host:$port ...\n";
    $_[HEAP]->{server}->put(\@values);
    #  счетчик запросов
    $_[HEAP]->{counter} = 1;
  },
  ConnectError => sub {
    print "could not connect to $host:$port ...\n";
  },
  ServerInput => sub {
    #when the server answer the question
    my ($kernel, $heap, $input) = @_[KERNEL, HEAP, ARG0];
    print "got result from $host:$port ... YAY!\n";
    #print to screen the result
    print $$input. "\n";
    
    # сервер ответил нам, если мы спросили его менее 10 раз, спрашиваем еще раз
    # увеличиваем счетчик.
    if ($_[HEAP]->{counter}++ < 10) {
        $_[HEAP]->{server}->put(\@values);
    }
  },
);
$poe_kernel->run();
exit 0;


Ну перед отправкой values поменяете как вам надо.
Только надо понимать, что если вы используете POE, то исполнение программы
распадается на отдельные события, т.е. просто так цикл использовать может не получитсья.

Почитайте что -нть про event-driven programming


--------------------
user posted image
user posted image
PM MAIL Jabber   Вверх
tima2fey
Дата 2.9.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.9.2011

Репутация: нет
Всего: нет



бесконечно благодарен как за примеры решения так и за наводку "куда копать"
PM MAIL   Вверх
Pfailed
Дата 2.9.2011, 11:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 19.7.2009

Репутация: 22
Всего: 39



Вот так
Код

use POE qw(Component::Client::TCP);

my $pcc_id = POE::Component::Client::TCP->new(
    RemoteAddress => 'localhost',
    RemotePort => 1010,
    Connected => sub {
        $_[HEAP]{server}->put("What the fuck?");
    },
    ServerInput => sub {},
    InlineStates => {
        ev_send => sub {
            $_[HEAP]{server}->put($_[ARG0]);
        }
    }
);

my $i = 0;
POE::Session->create(
    inline_states => {
        _start => sub { $_[KERNEL]->yield("loop") },
        loop => sub {
            $_[KERNEL]->post($pcc_id, "ev_send", ++$i);
            $_[KERNEL]->delay(loop => 1);
        }
    }
);

POE::Kernel->run;




--------------------
PM MAIL   Вверх
tima2fey
Дата 2.9.2011, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 2.9.2011

Репутация: нет
Всего: нет



sir_nuf_nuf блин, сначала прогнал, потом отписался на радостях а потом стал только разбираться в коде, оказалось не совсем то что мне нужно
то что из самого экземпляра класса (надеюсь я правильно использовал терминологию) можно вызвать я знал

а как вызвать из другого участка ВНЕ POE::Component::Client::TCP->new()
ну допустим я делаю сложные расчеты и их результаты мне нужно отправлять на сервер, и делать эти расчеты мне нужно за пределами  POE::Component::Client::TCP->new()

Добавлено через 3 минуты и 14 секунд
Pfailed  спасибо пошел разбираться, на первый взгляд то что нужно. Те как я понял для всех действий нужно создавать сессии.

Это сообщение отредактировал(а) tima2fey - 2.9.2011, 11:51
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0733 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.