Server-Sent Events em C++: Tempo Real sem Magia e Bibliotecas Desnecessárias

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

Por que uma requisição HTTP comum é como uma carta pelo correio, e SSE é um telegrama em tempo real

\n\n

Imagine: você está esperando uma notificação sobre um novo comentário no site. Você atualiza a página a cada 5 segundos. O servidor retorna um monte de HTML, CSS, imagens — e só então, no final, você vê: "Nenhum comentário novo". Conhecido? Isso se chama polling. Funciona, mas consome tráfego e sobrecarrega o servidor.

\n\n

Agora imagine outro cenário: você abriu a página e, um segundo depois, aparece uma mensagem: "Vasily comentou: 'Artigo legal!'". Sem recarregar, sem requisições extras. O servidor "empurra" os dados para você. Isso são os Server-Sent Events (SSE) — uma tecnologia que permite ao servidor enviar um fluxo de eventos para o cliente através de uma conexão HTTP comum.

\n\n

Neste artigo, vamos analisar como implementar SSE em C++ puro, sem usar frameworks pesados. Você aprenderá por que Server-Sent Events em C++ é uma excelente escolha para monitoramento, cotações de bolsa, notificações de chat e qualquer tarefa que exija transmissão unidirecional de dados em tempo real.

\n\n

Como funcionam os Server-Sent Events? Análise do protocolo

\n\n

SSE faz parte da especificação HTML5. O cliente abre uma conexão HTTP comum e diz ao servidor: "Estou pronto para ouvir eventos". O servidor, em resposta, não fecha a conexão, mas começa a enviar dados em um formato especial chamado text/event-stream.

\n\n

O formato da mensagem é extremamente simples:

\n\n
data: Este é o texto do evento\\n\\n
\n\n

Cada evento começa com data: e termina com uma quebra de linha dupla. Você pode adicionar id: para identificação, event: para o tipo de evento e retry: para especificar o tempo de reconexão em milissegundos.

\n\n

Exemplo de um fluxo completo:

\n\n
id: 42\nevent: new_message\ndata: {"user": "Vasily", "text": "Olá!"}\n\nid: 43\nevent: ping\ndata: Servidor vivo\n\n
\n\n

O cliente (navegador ou qualquer aplicação) processa essas linhas e gera eventos JavaScript. Tudo que é genial é simples.

\n\n

SSE vs WebSocket: quando escolher o quê?

\n\n

Muitos pensam imediatamente em WebSocket quando o assunto é tempo real. Vamos comparar:

\n\n
    \n
  • WebSocket — comunicação bidirecional. Cliente e servidor podem iniciar a troca. Exige um protocolo separado (ws://), precisa passar por proxies, frequentemente é bloqueado por firewalls corporativos.
  • \n
  • SSE — comunicação unidirecional (servidor → cliente). Funciona sobre HTTP comum. Reconecta automaticamente em caso de queda. Passa facilmente por qualquer proxy.
  • \n
\n\n

Se sua tarefa é enviar notificações para o cliente, e não esperar comandos dele, Server-Sent Events em C++ é uma solução elegante e simples. Não precisa arrastar bibliotecas pesadas, não precisa escrever handlers complexos.

\n\n

Escrevendo um servidor SSE em C++ do zero

\n\n

Para a implementação, precisaremos do mínimo: sockets e trabalho com HTTP. Em projetos reais, usam Boost.Beast ou libmicrohttpd, mas para entender a essência, escreveremos um servidor simples em C++ puro usando sockets POSIX.

\n\n

Nosso servidor irá:

\n
    \n
  • Aceitar uma requisição HTTP do cliente
  • \n
  • Determinar que o cliente quer SSE (pelo cabeçalho Accept: text/event-stream)
  • \n
  • Enviar um fluxo de eventos com a hora atual a cada 2 segundos
  • \n
\n\n

Passo 1: Criando o socket e ouvindo a porta

\n\n
#include <iostream>\n#include <string>\n#include <cstring>\n#include <unistd.h>\n#include <arpa/inet.h>\n#include <sys/socket.h>\n#include <thread>\n#include <chrono>\n#include <sstream>\n\nvoid handle_client(int client_socket) {\n    // Buffer para a requisição\n    char buffer[4096] = {0};\n    read(client_socket, buffer, 4096);\n    \n    // Verifica se é GET                

Blogs

Book Recommendations