2013-06-24 86 views
1

鑑於下面的代碼,我如何通過爲Fuins Bar :: dosomething中的'/ wsinit'打開的websocket向客戶端發送消息?Mojolicious websocket用法

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; 

請忽略以下多餘的空話其目的是滿足計算器的詳細信息/規範要求,這是目前阻止我公佈我的問題。

+0

代碼用什麼語言? Perl的? –

+0

是的,Perl,對不起。 – user2502652

回答

2

您需要通過client-side code中的javascript連接到websocket。一旦建立連接,您擁有的代碼應該適用於發送給客戶端。

#!/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方法,我不明白的問題。將其稱爲動作中的方法,或者將其作爲其他路線的動作連接。如果這不能回答這個問題,請澄清您的請求工作流程。