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/








