WebSocket en Java: biblioteca Java-WebSocket
En el desarrollo web moderno, la necesidad de comunicación bidireccional en tiempo real es cada vez más relevante. Aplicaciones de chat, juegos en línea, cotizaciones bursátiles, notificaciones: todo esto requiere una transmisión instantánea de datos entre el cliente y el servidor. Para Java, una de las implementaciones más populares y confiables del protocolo WebSocket es la biblioteca Java-WebSocket (también conocida como nv-websocket-client).
En este artículo, analizaremos en detalle cómo usar Java-WebSocket para crear aplicaciones de servidor y cliente, proporcionaremos ejemplos de código y revisaremos las mejores prácticas.
¿Qué es Java-WebSocket?
Java-WebSocket es una biblioteca ligera y potente de código abierto que implementa el protocolo WebSocket (RFC 6455). Permite a los desarrolladores de Java crear fácilmente tanto servidores WebSocket como clientes WebSocket sin necesidad de profundizar en los detalles de bajo nivel del protocolo.
Características principales de la biblioteca:
- Soporte completo para el lado del servidor y del cliente de WebSocket.
- Soporte para WSS (WebSocket Secure) mediante SSL/TLS.
- Reconexión automática en caso de desconexión.
- Manejo de mensajes fragmentados.
- Soporte para extensiones personalizadas.
- API simple basada en eventos (onOpen, onMessage, onClose, onError).
Instalación y configuración
Para usar la biblioteca, agregue la dependencia a su archivo pom.xml (Maven):
<dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.5.4</version></dependency>Si usa Gradle:
implementation 'org.java-websocket:Java-WebSocket:1.5.4'Creación de un servidor WebSocket
Veamos un ejemplo simple de un servidor WebSocket que recibe mensajes y los envía de vuelta a todos los clientes conectados (servidor eco):
import org.java_websocket.WebSocket;import org.java_websocket.handshake.ClientHandshake;import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;import java.util.Set;
public class EchoServer extends WebSocketServer {
public EchoServer(int port) { super(new InetSocketAddress(port)); }
@Override public void onOpen(WebSocket conn, ClientHandshake handshake) { System.out.println("Nueva conexión: " + conn.getRemoteSocketAddress()); }
@Override public void onClose(WebSocket conn, int code, String reason, boolean remote) { System.out.println("Desconexión: " + conn.getRemoteSocketAddress() + " (" + reason + ")"); }
@Override public void onMessage(WebSocket conn, String message) { System.out.println("Mensaje recibido: " + message); // Enviamos el mensaje de vuelta a todos los clientes Set<WebSocket> connections = getConnections(); for (WebSocket client : connections) { client.send("Eco: " + message); } }
@Override public void onError(WebSocket conn, Exception ex) { System.err.println("Error: " + ex.getMessage()); if (conn != null) { conn.close(); } }
@Override public void onStart() { System.out.println("Servidor iniciado en el puerto " + getPort()); }
public static void main(String[] args) { int port = 8887; EchoServer server = new EchoServer(port); server.start(); }}Este servidor se ejecuta en el puerto 8887 y, al recibir cualquier mensaje, lo envía de vuelta a todos los clientes conectados con el prefijo "Eco:".
Creación de un cliente WebSocket
Ahora escribamos un cliente que se conecte a nuestro servidor