WebSocket em Java: biblioteca Java-WebSocket
No desenvolvimento web moderno, a necessidade de comunicação bidirecional em tempo real torna-se cada vez mais relevante. Aplicativos de chat, jogos online, cotações de bolsa, notificações — tudo isso exige transmissão instantânea de dados entre cliente e servidor. Para Java, uma das implementações mais populares e confiáveis do protocolo WebSocket é a biblioteca Java-WebSocket (também conhecida como nv-websocket-client).
Neste artigo, vamos detalhar como usar o Java-WebSocket para criar aplicações de servidor e cliente, fornecer exemplos de código e discutir as melhores práticas.
O que é Java-WebSocket?
Java-WebSocket é uma biblioteca leve, poderosa e de código aberto que implementa o protocolo WebSocket (RFC 6455). Ela permite que desenvolvedores Java criem facilmente tanto servidores WebSocket quanto clientes WebSocket sem precisar mergulhar nos detalhes de baixo nível do protocolo.
Principais recursos da biblioteca:
- Suporte completo para os lados servidor e cliente do WebSocket.
- Suporte para WSS (WebSocket Secure) via SSL/TLS.
- Reconexão automática em caso de queda de conexão.
- Manipulação de mensagens fragmentadas.
- Suporte para extensões personalizadas.
- API simples baseada em eventos (onOpen, onMessage, onClose, onError).
Instalação e configuração
Para usar a biblioteca, adicione a dependência ao seu pom.xml (Maven):
<dependency> <groupId>org.java-websocket</groupId> <artifactId>Java-WebSocket</artifactId> <version>1.5.4</version></dependency>Se você usa Gradle:
implementation 'org.java-websocket:Java-WebSocket:1.5.4'Criação de um servidor WebSocket
Vamos ver um exemplo simples de um servidor WebSocket que recebe mensagens e as envia de volta para todos os 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("Nova conexão: " + conn.getRemoteSocketAddress()); }
@Override public void onClose(WebSocket conn, int code, String reason, boolean remote) { System.out.println("Desconexão: " + conn.getRemoteSocketAddress() + " (" + reason + ")"); }
@Override public void onMessage(WebSocket conn, String message) { System.out.println("Mensagem recebida: " + message); // Envia a mensagem de volta para todos os clientes Set<WebSocket> connections = getConnections(); for (WebSocket client : connections) { client.send("Eco: " + message); } }
@Override public void onError(WebSocket conn, Exception ex) { System.err.println("Erro: " + ex.getMessage()); if (conn != null) { conn.close(); } }
@Override public void onStart() { System.out.println("Servidor iniciado na porta " + getPort()); }
public static void main(String[] args) { int port = 8887; EchoServer server = new EchoServer(port); server.start(); }}Este servidor é iniciado na porta 8887 e, ao receber qualquer mensagem, a envia de volta para todos os clientes conectados com o prefixo "Eco:".
Criação de um cliente WebSocket
Agora vamos escrever um cliente que se conecta ao nosso servidor