Documentação WebSocket em Java

Guia completo para implementar comunicação em tempo real usando Jakarta WebSocket API

📌 1. Introdução

WebSockets permitem comunicação bidirecional e persistente entre servidor e cliente. Diferente do HTTP tradicional, que funciona no modelo request/response, o WebSocket mantém uma conexão aberta permitindo troca de dados em tempo real — ideal para chats, notificações, dashboards e sistemas colaborativos.

Esta documentação explica como implementar um servidor WebSocket usando Java + Jakarta API, incluindo dependências, criação de endpoint, testes e boas práticas.

📦 2. Dependência Maven

Adicione no seu pom.xml a API de WebSocket:

<dependency>
    <groupId>jakarta.websocket</groupId>
    <artifactId>jakarta.websocket-api</artifactId>
    <version>2.1.0</version>
    <scope>provided</scope>
</dependency>

Servidores compatíveis incluem:

🧩 3. Criando o Endpoint WebSocket

O WebSocket é criado usando a anotação @ServerEndpoint, que define um endereço onde os clientes irão se conectar.

import jakarta.websocket.*;
import jakarta.websocket.server.ServerEndpoint;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

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

    private static final Set<Session> sessions = ConcurrentHashMap.newKeySet();

    @OnOpen
    public void onOpen(Session session) {
        sessions.add(session);
        System.out.println("Cliente conectado: " + session.getId());
    }

    @OnMessage
    public void onMessage(String message, Session sender) {
        System.out.println("Mensagem recebida: " + message);
        broadcast(message);
    }

    @OnClose
    public void onClose(Session session) {
        sessions.remove(session);
        System.out.println("Cliente desconectado: " + session.getId());
    }

    @OnError
    public void onError(Session session, Throwable error) {
        error.printStackTrace();
    }

    private void broadcast(String message) {
        sessions.forEach(s -> {
            try {
                s.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
    }
}

🏗️ 4. Estrutura Recomendada do Projeto

src/
 └── main/java/com/meuprojeto/
      ├── websocket/
      │    └── ChatEndpoint.java
      ├── model/
      │    └── Message.java
      └── util/
           └── JsonUtils.java

🧪 5. Testando o WebSocket

Você pode testar usando um cliente WebSocket como:

URL de teste:

ws://localhost:8080/seuapp/ws/chat

📄 6. Modelo de Mensagem JSON (opcional)

{
  "sender": "João",
  "text": "Olá, mundo!"
}
---

🛡️ 7. Boas Práticas

📡 8. Envio de Mensagem Privada

private void sendPrivate(String message, String targetId) {
    sessions.stream()
        .filter(s -> s.getId().equals(targetId))
        .findFirst()
        .ifPresent(s -> {
            try {
                s.getBasicRemote().sendText(message);
            } catch (Exception e) {
                e.printStackTrace();
            }
        });
}

🚀 9. Deploy

Faça deploy em qualquer servidor compatível com Jakarta WebSocket, como Tomcat 10+. Basta gerar o WAR e colocar em /webapps.

---