Sobes.tech
Junior

¿Qué son los sockets web?

sobes.tech AI

Respuesta de la IA

Los Websockets son un protocolo de comunicación bidireccional a través de una única conexión TCP, que permite intercambiar datos en tiempo real entre el navegador y el servidor.

Diferencias clave respecto a las solicitudes HTTP tradicionales:

  • Comunicación bidireccional: El servidor puede enviar datos al cliente sin una solicitud previa del cliente.
  • Una sola conexión: Se establece una única conexión de larga duración, eliminando los costos de establecer una nueva conexión para cada intercambio de datos (como en HTTP).
  • Reducción de la latencia: Se gasta menos tiempo en establecer la conexión, intercambiar encabezados y procesar solicitudes/respuestas cortas.

Principio de funcionamiento:

  1. Handshake: El navegador envía una solicitud HTTP especial al servidor (con encabezados Upgrade: websocket y Connection: Upgrade).
  2. Establecimiento de la conexión: Si el servidor soporta websockets, responde con el código 101 Switching Protocols, tras lo cual la conexión pasa al protocolo websocket.
  3. Transmisión de datos: Tras establecerse la conexión, ambas partes pueden intercambiar mensajes libremente en cualquier momento.

Ejemplos de uso:

  • Juegos en línea
  • Chats y mensajería
  • Actualizaciones en tiempo real de datos (cotizaciones, noticias)
  • Herramientas colaborativas

Ventajas:

  • Baja latencia
  • Uso eficiente de recursos (menos overhead)
  • Comunicación bidireccional en tiempo real

Desventajas:

  • Requiere soporte tanto en el cliente (navegador) como en el servidor.
  • Implementación más compleja en comparación con solicitudes HTTP simples.

Ejemplo de código cliente en JavaScript:

// creación de websocket
const socket = new WebSocket('wss://example.com/websocket');

// manejador de apertura de conexión
socket.onopen = function(event) {
  console.log('Conexión establecida');
  socket.send('¡Hola, servidor!'); // envío de mensaje al servidor
};

// manejador de recepción de mensaje
socket.onmessage = function(event) {
  console.log('Mensaje recibido del servidor: ' + event.data);
};

// manejador de cierre de conexión
socket.onclose = function(event) {
  if (event.wasClean) {
    console.log(`Conexión cerrada limpiamente, código=${event.code} motivo=${event.reason}`);
  } else {
    console.log('Conexión interrumpida'); // por ejemplo, por fallo de red
  }
};

// manejador de error
socket.onerror = function(error) {
  console.error(`Error de websocket: ${error}`);
};

// cierre de conexión (si es necesario)
// socket.close();