WebSocket en Java: creación de aplicaciones en tiempo real

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: Por qué WebSocket es el estándar para aplicaciones en tiempo real en Java

Las aplicaciones web modernas requieren un intercambio instantáneo de datos entre el cliente y el servidor. El protocolo HTTP tradicional, basado en el modelo de "solicitud-respuesta", no es adecuado para tareas donde la latencia mínima es crítica: chats en línea, cotizaciones bursátiles, juegos multijugador o paneles de monitoreo en tiempo real.

El protocolo WebSocket resuelve este problema estableciendo una conexión bidireccional permanente entre el cliente y el servidor. Después del handshake HTTP inicial, la conexión se "actualiza" a WebSocket y los datos se transmiten en forma de tramas sin encabezados adicionales. Java, gracias a su potente biblioteca estándar y frameworks, proporciona excelentes herramientas para trabajar con WebSocket.

En este artículo, veremos cómo crear una aplicación en tiempo real completa en Java utilizando Jakarta WebSocket API (anteriormente Java EE WebSocket). Aprenderá sobre la configuración del servidor, el manejo de mensajes, la gestión de sesiones y las soluciones arquitectónicas típicas.



Fundamentos del trabajo con WebSocket en Java: Jakarta WebSocket API

A partir de Java EE 7 (Jakarta EE), se agregó JSR 356 — Java API para WebSocket — a la plataforma estándar. Esto significa que para crear un servidor WebSocket no es necesario conectar bibliotecas de terceros, solo se necesita un contenedor de servlets que soporte Jakarta EE (por ejemplo, Apache Tomcat 9+, Jetty 10+, WildFly).



Creación de un endpoint WebSocket

El elemento principal es una clase endpoint anotada con @ServerEndpoint. Dentro de ella, definimos métodos que se invocarán al conectarse, al recibir un mensaje, al ocurrir un error o al cerrar la conexión.



import jakarta.websocket.*;import jakarta.websocket.server.ServerEndpoint;import java.io.IOException;import java.util.Set;import java.util.concurrent.CopyOnWriteArraySet;

@ServerEndpoint("/chat")public class ChatEndpoint {

private static final Set<Session> sessions = new CopyOnWriteArraySet<>();

@OnOpen public void onOpen(Session session) { sessions.add(session); broadcast("Usuario conectado. Total: " + sessions.size()); }

@OnMessage public void onMessage(String message, Session session) { broadcast("[" + session.getId() + "]: " + message); }

@OnClose public void onClose(Session session) { sessions.remove(session); broadcast("Usuario desconectado. Restantes: " + sessions.size()); }

@OnError public void onError(Session session, Throwable throwable) { System.err.println("Error en la sesión " + session.getId() + ": " + throwable.getMessage()); }

private void broadcast(String message) { for (Session s : sessions) { if (s.isOpen()) { try { s.getBasicRemote().sendText(message); } catch (IOException e) { e.printStackTrace(); } } } }}


En este ejemplo:

  • @ServerEndpoint("/chat") — indica que el endpoint está disponible en la ruta relativa /chat.
  • CopyOnWriteArraySet — colección thread-safe para almacenar sesiones activas.
  • @OnOpen — se invoca al establecer la conexión.
  • @OnMessage — se invoca al recibir un mensaje de texto.
  • @OnClose — se invoca al cerrar la conexión.
  • @OnError — manejo de errores.


JavaScript del lado del cliente

Para probar el servidor, basta con un archivo HTML simple con JavaScript:

<!DOCTYPE html><html><head>    <title>WebSocket Chat</title></head><body>    <div id="messages"></div>    <input type="text" i                

Blogs

Book Recommendations