Real-time clock

A real-time clock made with Mojolicious::Lite. I am using WebSocket. It can be run on Chrome that natively supports WebSockets.

Real-time clock

It is a real-time clock.

[f: id: perlcodesample: 20100415220535p: image]

Source code

The source code of the real-time clock.

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>

Associated Information