Server-Sent Events em Java: como enviar dados em tempo real sem WebSocket

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Server-Sent Events em Java: quando WebSocket é exagero e HTTP não é suficiente

\n\n

Você 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\n

Neste 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\n

O que são Server-Sent Events e para que servem?

\n\n

Server-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\n

SSE é 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
\n\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\n

Server-Sent Events vs WebSocket: o que escolher?

\n\n

Se 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\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
CritérioServer-Sent EventsWebSocket
DireçãoServidor → ClienteBidirecional
ProtocoloHTTP/1.1, HTTP/2ws:// ou wss://
Reconexão automáticaSim (integrada ao navegador)Não (precisa ser implementada)
Complexidade de implementaçãoBaixaMédia/Alta
Suporte a navegadoresTodos os modernosTodos os modernos
\n\n

Para o site educacional PythonLib, escolhemos Java porque é uma linguagem confiável para desenvolvimento no servidor. Vamos nessa!

\n\n

Parte do servidor: implementação de SSE em Java com Servlet API

\n\n

Vamos 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
\n\n

Exemplo 1: Servidor SSE simples com Java Servlet

\n\n

Vamos criar um servlet que envia a hora atual a cada 5 segundos.

\n\n
import 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                

Blogs

Book Recommendations