Por que uma requisição HTTP comum é como uma carta pelo correio, e SSE é um telegrama em tempo real
\n\nImagine: 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\nAgora 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\nNeste 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\nComo funcionam os Server-Sent Events? Análise do protocolo
\n\nSSE 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.
O formato da mensagem é extremamente simples:
\n\ndata: Este é o texto do evento\\n\\n\n\nCada 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.
Exemplo de um fluxo completo:
\n\nid: 42\nevent: new_message\ndata: {"user": "Vasily", "text": "Olá!"}\n\nid: 43\nevent: ping\ndata: Servidor vivo\n\n\n\nO cliente (navegador ou qualquer aplicação) processa essas linhas e gera eventos JavaScript. Tudo que é genial é simples.
\n\nSSE vs WebSocket: quando escolher o quê?
\n\nMuitos 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
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\nEscrevendo um servidor SSE em C++ do zero
\n\nPara 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\nNosso 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
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