Mojolicious использование веб-сокетов

Учитывая приведенный ниже код, как мне отправить сообщение клиенту через веб-сокет, открытый для «/ wsinit», изнутри Fu:: Bar:: dosomething?

package Fu;
use Mojo::Base 'Mojolicious';

sub startup
{
    my $r = shift->routes;

    $r->get('/')->to(controller => 'bar', action => 'init');

    $r->websocket('/wsinit')->to(controller => 'bar', action => 'wsinit');

    $r->get('/dosomething')->to(controller => 'bar', action => 'dosomething');
}

1;

# -- ^L
# -- 

package Fu::Bar;
use Mojo::Base 'Mojolicious::Controller';

sub init
{
    my $self = shift;
    $self->render(text => 'init');
}
sub wsinit
{
    my $self = shift;
    $self->app->log->debug( 'Websocket opened.' );
    $self->send({json => {fu => 'bar'}});
}
sub dosomething
{
    my $self = shift;
}

1;

Пожалуйста, не обращайте внимания на следующее лишнее словоблудие, целью которого является удовлетворение требований к деталям/коду stackoverflow, которые в настоящее время не позволяют мне опубликовать свой вопрос.


person user2502652    schedule 24.06.2013    source источник
comment
Код на каком языке? Перл?   -  person Ira Baxter    schedule 25.06.2013


Ответы (1)


Вам нужно будет подключиться к веб-сокету через javascript в коде на стороне клиента. Код, который у вас есть, выглядит так, как будто он должен работать для отправки клиенту после установления соединения.

#!/usr/bin/env perl

use Mojolicious::Lite;

any '/' => 'index';

websocket '/ws' => sub {
  my $c = shift;
  $c->send({ json => { foo => 'bar' } });
};

app->start;

__DATA__

@@ index.html.ep

<!DOCTYPE html>
<html>
<head>
  <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
</head>
<body>
  <p id="result"></p>
  %= javascript begin
    var ws = new WebSocket('<%= url_for('ws')->to_abs %>');
    ws.onmessage = function (e) {
      $('#result').text(e.data)
    };
  % end
</body>
</html>

Если вопрос о методе dosomething, я не понимаю вопроса. Вызовите его как метод в действии или подключите его как действие для какого-либо другого маршрута. Если это не дает ответа на вопрос, уточните рабочий процесс вашего запроса.

person Joel Berger    schedule 26.06.2013