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:
- Handshake: El navegador envía una solicitud HTTP especial al servidor (con encabezados
Upgrade: websocketyConnection: Upgrade). - 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. - 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();