Как действовать после запуска приложения; в веб-сокете Mojolicious для Perl

У меня есть веб-сокет на стороне сервера, работающий в Linux, и в конце веб-сокет работает, но после запуска приложения-> нужно выполнить больше; Как и в приведенном ниже коде, я напечатал привет, мир, чтобы попробовать, но это не работает. Кто-нибудь знает, как с этим справиться?

    #!/usr/bin/perl
use utf8;
use Mojolicious::Lite;
use DateTime;
use Mojo::JSON;
use Mojo::Transaction::WebSocket;
use Data::Dumper;
no strict "refs";

get '/' => 'index';
my $clients = {};
# Arrays voor het ordenen van gasten
my @hoofdArray =();
my $teller = 0;

websocket '/echo' => sub {
    my $self = shift;
    $self->inactivity_timeout(0);
    app->log->debug(sprintf 'Client connected: %s', $self->tx);
    # Toevoegen origin op array positie 
    $teller = $teller + 1;      
    # later renderen van de websocket

    # Pushen van alle gasten in een array
    my $id = sprintf "%s", $self->tx;
    $clients->{$id} = $self->tx;
    $self->on(message =>
        sub {

            my ($self, $msg) = @_;

            if (index($msg, "naam:") != -1){
                my $ori = $self->tx->handshake->connection;
                my $naam = substr $msg,5;
                print $naam."\n";

                my @gasten = ();
                push(@gasten, $ori);
                push(@gasten, $naam);
                push(@hoofdArray, \@gasten);
            }
            else {   
                my $json = Mojo::JSON->new;
                my $dt   = DateTime->now( time_zone => 'Europe/Amsterdam');
                my $currentNaam = "undefinid";
                for (my $i = 0; $i < @hoofdArray; $i++){

                    if($hoofdArray[$i]->[0] eq $self->tx->handshake->connection){
                        $currentNaam = $hoofdArray[$i]->[1];
                        last;
                    }
                }

                for (keys %$clients) {
                    $clients->{$_}->send(
                        $json->encode({
                            hms  => $currentNaam,
                            text => $msg,
                        })
                    );
                    #print $_[0]->tx->handshake->req->content->headers->origin."\n";
                    #print $_[0]->tx->handshake->connection."\n";

                }
                print Dumper $hoofdArray[0];
                print Dumper $hoofdArray[1];
            }
        }
    );

    $self->on(finish =>
        sub {
            app->log->debug('Client with hash: '.$clients->{$id}.' disconnected');
            delete $clients->{$id};
        }
    );
};

app->start;
print "Hello World! \n";

person Noise    schedule 29.08.2014    source источник
comment
Что вы пытаетесь достичь? Я думаю, вы неправильно поняли назначение Mojolicious — он разработан как веб-фреймворк и доставляет контент через веб-сервер. В этом контексте просто printing бессмысленно.   -  person Sobrique    schedule 29.08.2014


Ответы (1)


Короткий ответ заключается в том, что app->start никогда не возвращается. Код, предшествующий app->start, создает обработчики для определенных вами маршрутов. Когда сервер получает запрос на один из этих маршрутов, он использует один из предоставленных вами обработчиков для создания содержимого, возвращаемого сервером. Возможно, вам будет полезно почитать о программировании, управляемом событиями. Маршруты можно рассматривать как события, которые обрабатывает ваша программа. app->start более или менее означает «запустить цикл событий».

person Jonathan    schedule 29.08.2014