Sobes.tech
Junior

O que são os WebSockets?

sobes.tech IA

Resposta da IA

Os Websockets são um protocolo de comunicação bidirecional através de uma única ligação TCP, permitindo a troca de dados em tempo real entre o navegador e o servidor.

Principais diferenças em relação às requisições HTTP tradicionais:

  • Comunicação bidirecional: O servidor pode enviar dados ao cliente sem uma solicitação prévia do cliente.
  • Uma única ligação: É estabelecida uma ligação de longa duração, eliminando os custos de estabelecer uma nova ligação para cada troca de dados (como no HTTP).
  • Redução da latência: Menos tempo é gasto na estabelecimento da ligação, troca de cabeçalhos e processamento de requisições/respostas curtas.

Princípio de funcionamento:

  1. Handshake: O navegador envia uma requisição HTTP especial ao servidor (com os cabeçalhos Upgrade: websocket e Connection: Upgrade).
  2. Estabelecimento da ligação: Se o servidor suportar websockets, responde com o código 101 Switching Protocols, após o qual a ligação passa a usar o protocolo websocket.
  3. Transmissão de dados: Após a ligação ser estabelecida, ambas as partes podem trocar mensagens livremente a qualquer momento.

Exemplos de uso:

  • Jogos online
  • Chats e mensageiros
  • Atualizações em tempo real de dados (cotação, notícias)
  • Ferramentas colaborativas

Vantagens:

  • Baixa latência
  • Uso eficiente de recursos (menos overhead)
  • Comunicação bidirecional em tempo real

Desvantagens:

  • Requer suporte tanto no cliente (navegador) como no servidor.
  • Implementação mais complexa comparada às requisições HTTP simples.

Exemplo de código cliente em JavaScript:

// criação de websocket
const socket = new WebSocket('wss://example.com/websocket');

// manipulador de abertura de ligação
socket.onopen = function(event) {
  console.log('Ligação estabelecida');
  socket.send('Olá, servidor!'); // envio de mensagem ao servidor
};

// manipulador de receção de mensagem
socket.onmessage = function(event) {
  console.log('Mensagem recebida do servidor: ' + event.data);
};

// manipulador de encerramento de ligação
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Ligação fechada limpidamente, código=${event.code} motivo=${event.reason}`);
  } else {
    console.log('Ligação interrompida'); // por exemplo, devido a uma falha de rede
  }
};

// manipulador de erro
socket.onerror = function(error) {
  console.error(`Erro de websocket: ${error}`);
};

// encerramento da ligação (se necessário)
// socket.close();