1

Linuxでサーバー側のwebsocketを実行しており、最後にwebsocketが実行されていますが、app-> startの後にさらに実行する必要があります。次のコードのように、print hello world を試してみましたが、うまくいきません。誰かがこれを処理する方法を知っていますか?

    #!/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";
4

1 に答える 1

4

簡単に言えば、 app->start は返されないということです。app->start の前のコードは、定義したルートのハンドラーを作成します。サーバーは、これらのルートの 1 つに対する要求を受け取ると、指定したハンドラーの 1 つを使用して、サーバーから返されたコンテンツを生成します。イベント ドリブン プログラミングについて読むと役立つ場合があります。ルートは、プログラムが処理するイベントと考えることができます。app->start more-or-less は、「イベント ループを開始する」ことを意味します。

于 2014-08-29T21:09:12.980 に答える