リアルタイム時計 / Mojoliciousサンプル
Mojolicious::Liteで作ったリアルタイム時計です。WebSocketを利用しています。ネイティブでWebSocketをサポートしているChromeで実行することができます。
リアルタイム時計
リアルタイム時計です。
[f:id:perlcodesample:20100415220535p:image]
ソースコード
リアルタイム時計のソースコードです。
use Mojolicious::Lite;
use Mojo::IOLoop;
my $clients = {};
my $loop = Mojo::IOLoop->singleton;
websocket '/' => sub {
my $self = shift;
# Client id
my $cid = "$self";
# Controller
my $controller = $self;
# Send date and time
my $datetime = localtime;
$self->send($datetime);
# Receive message;
$self->on('message' => sub {
my ($self, $message) = @_;
# Start clock
if ($message eq 'Start') {
# Shortcut
return if $clients->{$cid}{running};
# Start
$clients->{$cid}{running} = 1;
# Subroutine for sending date and time
my $send_datetime;
$send_datetime = sub {
# Send date and time
my $datetime = localtime;
$controller->send($datetime);
# Timer
$loop->timer(1, $send_datetime) if $clients->{$cid}{running};
};
# Send
$send_datetime->();
}
# Stop clock
else { $clients->{$cid}{running} = 0 }
});
# on_finish
$self->on('finish' => sub {
# Remove client
delete $clients->{$cid};
});
};
get '/' => 'index';
app->start;
__DATA__
@@ index.html.ep
% my $url = $self->req->url->to_abs->scheme( $self->req->is_secure ? 'wss' : 'ws' )->path( '/' );
<!doctype html>
<html>
<head>
<title>Mojo Websocket Demo</title>
<script type="text/javascript">
// only load the flash fallback when needed
if ( !( 'WebSocket' in window ) ) {
document.write([
'<scr'+'ipt type="text/javascript" src="web-socket-js/swfobject.js"></scr'+'ipt>',
'<scr'+'ipt type="text/javascript" src="web-socket-js/FABridge.js"></scr'+'ipt>',
'<scr'+'ipt type="text/javascript" src="web-socket-js/web_socket.js"></scr'+'ipt>'
].join(''));
}
</script>
<script type="text/javascript">
if (WebSocket.__initialize) {
// Set URL of your WebSocketMain.swf here:
WebSocket.__swfLocation = 'web-socket-js/WebSocketMain.swf';
}
// example copied from web-socket-js/sample.html
var ws, input, clock;
function init() {
// Connect to Web Socket.
ws = new WebSocket('<%= $url %>');
// Receive message
ws.onmessage = function(e) {
// Update clock
clock = document.getElementById('clock');
clock.innerHTML = e.data;
};
}
function onClockStart() {
// Start clock
ws.send('Start');
}
function onClockStop() {
// Stop clock
ws.send('Stop');
}
window.onload = init;
</script>
</head>
<span id="clock"></span>
<button onclick="onClockStart(); return false;">Start</button>
<button onclick="onClockStop(); return false;">Stop</button>
</html>
Perlゼミ

