lunes, 16 de marzo de 2026

WebSockets con Mojolicious

En esta ocasión veremos un ejemplo sencillo de WebSockets con Mojolicious.

Como vimos en entregas pasadas:

Mojolicious es un framework para Perl que es similar a Dancer2, pero más completo. Además nos permite trabajar con WebSockets, que es el tema que vamos a ver. Como vimos en una entrega anterior, los WebSockets son un protocolo que permite comunicación bidireccional en tiempo real entre cliente y servidor, a diferencia de HTTP que funciona en modo solicitud-respuesta.

Observemos el siguiente código.

web_socket.pl

use Mojolicious::Lite -signatures;

# Renderiza la plantilla "index.html.ep" desde la seccion 
get '/' => sub ($c) {
  $c->render(template => 'index');
};

# Servicio WebSocket usado por la plantilla para extraer el título del sitio web
websocket '/title' => sub ($c) {
  $c->on(message => sub ($c, $msg) {
    my $title = $c->ua->get($msg)->result->dom->at('title')->text;
    $c->send($title);
  });
};

app->start;
__DATA__

@@ index.html.ep
% my $url = url_for 'title';
<script>
  const ws = new WebSocket('<%= $url->to_abs %>');
  ws.onmessage = function (event) { document.body.innerHTML += event.data };
  ws.onopen    = function (event) { ws.send('https://www.wikipedia.org') };
</script>

En este programa Perl hacemos uso del Framework Mojolicious. Donde se mostrará una sencilla página HTML que obtendrá el nombre del sitio web definido dentro de la función ws.send("web_page"). En este caso obtendremos el título de la página de Wikipedia.

Lo ejecutaremos de la siguiente manera:

$ perl web_socket.pl daemon -l http://*:8080

Abrimos un navegador en la ruta: http://127.0.0.1:8080/

También podemos ejecutar de este modo:

$ morbo web_socket.pl

En este caso, abrimos un navegador en la ruta: http://127.0.0.1:3000/

Salida:

[2026-03-16 15:55:15.56279] [27716] [info] Listening at "http://*:8080"
Web application available at http://127.0.0.1:8080
[2026-03-16 15:55:50.81445] [27716] [trace] [1ODKO9_D-nZZ] GET "/"
[2026-03-16 15:55:50.81945] [27716] [trace] [1ODKO9_D-nZZ] Routing to a callback
[2026-03-16 15:55:50.82339] [27716] [trace] [1ODKO9_D-nZZ] Rendering template "index.html.ep" from DATA section
[2026-03-16 15:55:50.82998] [27716] [trace] [1ODKO9_D-nZZ] 200 OK (0.015422s, 64.842/s)
[2026-03-16 15:55:51.40533] [27716] [trace] [ThnOL6K5Pt-k] GET "/title"
[2026-03-16 15:55:51.40978] [27716] [trace] [ThnOL6K5Pt-k] Routing to a callback
[2026-03-16 15:55:51.41264] [27716] [trace] [ThnOL6K5Pt-k] 101 Switching Protocols (0.00707s, 141.443/s)

En la página se verá el nombre de "Wikipedia".

Hagamos algo más complicado. Crear una aplicación que reciba peticiones y responda dinámicamente. Esto con ayuda de los WebSockets.

web_sockets.pl

use Mojolicious::Lite -signatures;

# Ruta normal para probar
get '/' => sub ($c) {
  $c->render(template => 'index');
};

# Endpoint WebSocket
websocket '/echo' => sub ($c) {
  $c->on(message => sub ($c, $msg) {
    # Responde con el mismo mensaje recibido
    $c->send("Servidor recibió: $msg");
  });
};

app->start;

__DATA__

@@ index.html.ep
<!DOCTYPE html>
<html>
  <head><title>Codemonkey Junior WebSocket con Mojolicious</title></head>
  <body>
    <h1>WebSocket con Mojolicious</h1>
    <script>
      // Conectar al servidor WebSocket
      const ws = new WebSocket('<%= url_for("echo")->to_abs %>');
      
      ws.onopen = function() {
        ws.send("¡Hola desde el cliente!");
      };
      
      ws.onmessage = function(event) {
        document.body.innerHTML += "<p>" + event.data + "</p>";
      };
    </script>
  </body>
</html>

Ejecutamos:

$ morbo web_sockets.pl

Abrimos un navegador en la ruta: http://127.0.0.1:3000/

Salida:

Web application available at http://127.0.0.1:3000
[2026-03-16 16:16:20.73121] [-15804] [trace] [2NKo74iWOXU_] GET "/"
[2026-03-16 16:16:20.73267] [-15804] [trace] [2NKo74iWOXU_] Routing to a callback
[2026-03-16 16:16:20.73900] [-15804] [trace] [2NKo74iWOXU_] Rendering template "index.html.ep" from DATA section
[2026-03-16 16:16:20.74582] [-15804] [trace] [2NKo74iWOXU_] 200 OK (0.014579s, 68.592/s)
[2026-03-16 16:16:21.61504] [-15804] [trace] [u4UBFpSvNxLo] GET "/echo"
[2026-03-16 16:16:21.61669] [-15804] [trace] [u4UBFpSvNxLo] Routing to a callback
[2026-03-16 16:16:21.61922] [-15804] [trace] [u4UBFpSvNxLo] 101 Switching Protocols (0.004105s, 243.605/s)

Se abrirá una página web con el mensaje:

WebSocket con Mojolicious
Servidor recibió: ¡Hola desde el cliente!

Mojolicious permite construir aplicaciones más complejas: broadcasting a múltiples clientes, integración con Minion para tareas en segundo plano, o extracción de datos en tiempo real desde APIs externas.

Estos son solo ejemplos básicos de uso de WebSockets y Mojolicious.

En próximas entregas veremos esto más a fondo.

Enlaces:

https://mojolicious.org/
https://mojolicious.io/

No hay comentarios:

Publicar un comentario

WebSockets con Mojolicious

En esta ocasión veremos un ejemplo sencillo de WebSockets con Mojolicious. Como vimos en entregas pasadas: Mojolicious un fram...

Etiquetas

Archivo del blog