Server-Sent Events em Java: quando WebSocket é exagero e HTTP não é suficiente
\n\nVocê já se perguntou como funcionam os feeds de notícias no Twitter, as notificações no Telegram ou os resultados ao vivo de eventos esportivos? Aparentemente, os dados chegam sozinhos, sem atualizar a página. O segredo é simples: Server-Sent Events (SSE) — uma tecnologia que permite ao servidor enviar dados ao cliente em tempo real através de uma conexão HTTP comum.
\n\nNeste artigo, vamos explorar Server-Sent Events em Java. Você aprenderá por que o SSE é frequentemente mais conveniente que o WebSocket, como configurar o servidor com Java Servlet API e como receber eventos no cliente. O código será funcional, o estilo será dinâmico e os exemplos serão o mais próximo possível de tarefas reais.
\n\nO que são Server-Sent Events e para que servem?
\n\nServer-Sent Events (SSE) é um padrão W3C que permite ao servidor "enviar" dados ao cliente através de uma única conexão HTTP de longa duração. O cliente se inscreve em um fluxo de eventos e o servidor envia mensagens conforme elas surgem.
\n\nSSE é ideal para:
\n- \n
- Notificações — novos e-mails, mensagens, alterações de status. \n
- Feeds de notícias — postagens, tweets, cotações de moedas. \n
- Monitoramento — logs, métricas do servidor, progresso de tarefas. \n
- Dados ao vivo — cotações de ações, resultados de jogos, clima. \n
Ao contrário do WebSocket, o SSE funciona apenas em uma direção (servidor → cliente), mas isso é suficiente para a maioria dos cenários. Além disso, o SSE usa HTTP comum, não requer portas adicionais e passa facilmente por proxies e firewalls.
\n\nServer-Sent Events vs WebSocket: o que escolher?
\n\nSe você precisa apenas enviar dados do servidor para o cliente (sem retorno), escolha SSE. É mais simples, mais leve e mais barato. O WebSocket é justificado quando o cliente também envia dados ativamente (por exemplo, em chats ou jogos online).
\n\n| Critério | \nServer-Sent Events | \nWebSocket | \n
|---|---|---|
| Direção | \nServidor → Cliente | \nBidirecional | \n
| Protocolo | \nHTTP/1.1, HTTP/2 | \nws:// ou wss:// | \n
| Reconexão automática | \nSim (integrada ao navegador) | \nNão (precisa ser implementada) | \n
| Complexidade de implementação | \nBaixa | \nMédia/Alta | \n
| Suporte a navegadores | \nTodos os modernos | \nTodos os modernos | \n
Para o site educacional PythonLib, escolhemos Java porque é uma linguagem confiável para desenvolvimento no servidor. Vamos nessa!
\n\nParte do servidor: implementação de SSE em Java com Servlet API
\n\nVamos começar pelo servidor. A maneira mais simples é usar Java Servlets padrão. Precisamos:
\n- \n
- Definir o cabeçalho
Content-Type: text/event-stream. \n - Desabilitar o cache (
Cache-Control: no-cache). \n - Manter a conexão aberta. \n
- Enviar dados no formato
data: ...\\n\\n. \n
Exemplo 1: Servidor SSE simples com Java Servlet
\n\nVamos criar um servlet que envia a hora atual a cada 5 segundos.
\n\nimport javax.servlet.ServletException;\nimport javax.servlet.annotation.WebServlet;\nimport javax.servlet.http.HttpServlet;\nimport javax.servlet.http.HttpServletRequest;\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\nimport java.io.PrintWriter;\nimport java.time.LocalTime;\nimport java.util.concurrent.Executors;\nimport java.util.concurrent.ScheduledExecutorServ