TL;DR
Use WebSocket Nativo para comunicação em tempo real simples com navegadores modernos. Use Socket.IO quando precisar de reconexão automática, transportes de fallback ou salas/namespaces. O Socket.IO adiciona mais de 200KB de sobrecarga, mas lida com casos extremos. A Modern PetstoreAPI implementa ambos: WebSocket Nativo para leilões, Socket.IO para chat.
Introdução
Você precisa de comunicação bidirecional em tempo real. Deve usar WebSocket Nativo ou Socket.IO? O WebSocket Nativo é integrado aos navegadores e é rápido. O Socket.IO adiciona recursos, mas aumenta o tamanho do pacote em mais de 200KB.
A Modern PetstoreAPI usa ambos. WebSocket Nativo para leilões de pets ao vivo onde o desempenho é crucial. Socket.IO para chat de suporte ao cliente onde a reconexão automática e as salas são valiosas.
Se você está testando APIs em tempo real, o Apidog suporta testes de WebSocket Nativo e Socket.IO.
WebSocket Nativo
O WebSocket Nativo é o padrão do navegador para comunicação bidirecional.
Uso Básico
const ws = new WebSocket('wss://petstoreapi.com/auctions/019b4132');
ws.onopen = () => {
ws.send(JSON.stringify({ type: 'bid', amount: 500 }));
};
ws.onmessage = (event) => {
const data = JSON.parse(event.data);
console.log('Received:', data);
};
ws.onerror = (error) => {
console.error('WebSocket error:', error);
};
ws.onclose = () => {
console.log('Connection closed');
};
Prós
1. Sem dependências - Integrado aos navegadores 2. Rápido - Sobrecarga mínima 3. Simples - API direta 4. Pequeno - Sem impacto no tamanho do pacote
Contras
1. Sem reconexão automática - Você deve implementar a lógica de repetição 2. Sem fallback - Se o WebSocket falhar, você fica travado 3. Sem salas/namespaces - Deve implementar por conta própria 4. Heartbeat manual - Precisa de ping/pong para a saúde da conexão
Recursos do Socket.IO
Socket.IO é uma biblioteca construída sobre WebSocket com recursos adicionais.
Uso Básico
import io from 'socket.io-client';
const socket = io('https://petstoreapi.com', {
path: '/chat'
});
socket.on('connect', () => {
socket.emit('join-room', 'support-123');
});
socket.on('message', (data) => {
console.log('Received:', data);
});
socket.on('disconnect', () => {
console.log('Disconnected - will auto-reconnect');
});
Recursos Principais
1. Reconexão Automática
const socket = io('https://petstoreapi.com', {
reconnection: true,
reconnectionDelay: 1000,
reconnectionAttempts: 5
});
2. Transportes de Fallback
Se o WebSocket falhar, o Socket.IO tenta:
- WebSocket
- HTTP long-polling
- HTTP streaming
3. Salas e Namespaces
// Servidor
io.of('/chat').on('connection', (socket) => {
socket.join('support-123');
socket.to('support-123').emit('user-joined');
});
// Cliente
const socket = io('/chat');
4. Confirmações (Acknowledgments)
socket.emit('bid', { amount: 500 }, (response) => {
console.log('Servidor confirmou:', response);
});
5. Suporte a Binários
socket.emit('image', buffer);
Contras
1. Pacote grande - Mais de 200KB minificado 2. Dependência do servidor - Precisa de um servidor Socket.IO 3. Mais complexo - Conceitos adicionais para aprender 4. Sobrecarga - Camada de protocolo extra
Comparação
| Recurso | WebSocket Nativo | Socket.IO |
|---|---|---|
| Tamanho do Pacote | 0 KB | 200+ KB |
| Reconexão Automática | Não | Sim |
| Fallback | Não | Sim (long-polling) |
| Salas | Não | Sim |
| Confirmações | Não | Sim |
| Binário | Sim | Sim |
| Suporte a Navegadores | Modernos | Todos (via fallback) |
| Servidor | Qualquer WebSocket | Servidor Socket.IO |
| Complexidade | Simples | Mais complexo |
Como a Modern PetstoreAPI Usa Ambos
WebSocket Nativo para Leilões
Leilões de pets ao vivo precisam de baixa latência:
const ws = new WebSocket('wss://petstoreapi.com/auctions/019b4132');
ws.onmessage = (event) => {
const { type, data } = JSON.parse(event.data);
if (type === 'bid') {
updateBidDisplay(data.amount, data.userId);
}
if (type === 'sold') {
showSoldNotification(data.winnerId);
}
};
// Enviar lance
ws.send(JSON.stringify({
type: 'bid',
amount: 500
}));
Por que WebSocket Nativo:
- Crítico para o desempenho
- Público de navegadores modernos
- Protocolo de lance simples
- Não há necessidade de salas
Socket.IO para Chat de Suporte
O chat de suporte ao cliente precisa de confiabilidade:
const socket = io('https://petstoreapi.com/chat');
socket.on('connect', () => {
socket.emit('join-support', { userId: 'user-456' });
});
socket.on('message', (msg) => {
displayMessage(msg);
});
socket.on('agent-typing', () => {
showTypingIndicator();
});
// Enviar mensagem
socket.emit('message', {
text: 'I need help with my order',
userId: 'user-456'
});
Por que Socket.IO:
- Reconexão automática (usuários em dispositivos móveis)
- Salas (múltiplas sessões de suporte)
- Fallback para redes corporativas
- Confirmações para entrega de mensagens
Veja a documentação do WebSocket da Modern PetstoreAPI e a documentação do Socket.IO.
Testando com Apidog
O Apidog suporta ambos os protocolos:
Testar WebSocket Nativo:
1. Criar requisição WebSocket
2. Conectar-se a wss://petstoreapi.com/auctions/019b4132
3. Enviar mensagens de teste
4. Validar respostas
Testar Socket.IO:
1. Criar conexão Socket.IO
2. Testar eventos e confirmações
3. Validar o comportamento da sala
4. Testar cenários de reconexão
Quando Usar Cada Um
Use WebSocket Nativo Quando:
- Construindo apenas para navegadores modernos
- O desempenho é crítico
- Mensagens bidirecionais simples
- Deseja tamanho mínimo de pacote
- Não precisa de reconexão automática
Exemplos:
- Leilões ao vivo
- Dashboards em tempo real
- Jogos (com reconexão manual)
- Cotações de ações (stock tickers)
Use Socket.IO Quando:
- Precisa de reconexão automática
- Suporta navegadores mais antigos
- Redes corporativas (precisa de fallback)
- Precisa de salas/namespaces
- Deseja confirmações
- Aplicativos móveis (redes não confiáveis)
Exemplos:
- Aplicativos de chat
- Edição colaborativa
- Suporte ao cliente
- Notificações com confirmação de entrega
Conclusão
O WebSocket Nativo é mais rápido e simples. O Socket.IO é mais rico em recursos, mas mais pesado. Escolha com base nas suas necessidades, não em qual é “melhor”.
A Modern PetstoreAPI usa ambos: WebSocket Nativo onde o desempenho é importante, Socket.IO onde a confiabilidade e os recursos são importantes.
Perguntas Frequentes (FAQ)
Posso usar Socket.IO com clientes WebSocket Nativo?
Não. O Socket.IO usa um protocolo personalizado. Você precisa de um cliente Socket.IO para se conectar a um servidor Socket.IO.
O Socket.IO funciona através de firewalls corporativos?
Sim. O Socket.IO retorna para HTTP long-polling se o WebSocket for bloqueado.
O Socket.IO é mais lento que o WebSocket Nativo?
Levemente. O Socket.IO adiciona uma sobrecarga de protocolo, mas a diferença é insignificante para a maioria dos aplicativos.
Posso migrar do Socket.IO para o WebSocket Nativo?
Sim, mas você precisará implementar a reconexão, salas e outros recursos por conta própria.
O WebSocket Nativo suporta salas?
Não. Você deve implementar a lógica de salas no servidor e rastrear quais conexões pertencem a quais salas.
