system onlinepath: /guias/programacion/aplicaciones-en-tiempo-real-con-websockets/mode: knowledge_baselocal:
Programación · Nivel intermedio

Cómo crear aplicaciones en tiempo real con WebSockets

Chats, notificaciones, marcadores en vivo, edición colaborativa: todo lo que se actualiza al instante suele apoyarse en WebSockets, un canal bidireccional y persistente entre navegador y servidor que rompe el molde de petición-respuesta de HTTP.

16 min de lectura▣ Actualizada el ◇ Por Underc0de
Respuesta rápida

Un WebSocket es un canal de comunicación bidireccional y persistente entre el navegador (cliente) y el servidor. La diferencia clave con HTTP es el modelo: HTTP funciona por petición y respuesta —el cliente pregunta, el servidor contesta y la conexión se cierra—, de modo que el servidor no puede avisar al cliente por su cuenta. Con WebSockets, una vez establecida la conexión, queda abierta y ambos lados pueden enviar mensajes en cualquier momento, sin volver a pedir nada. Eso es lo que hace posible el tiempo real: chats, notificaciones que llegan solas, marcadores deportivos en vivo, cotizaciones, edición colaborativa o juegos multijugador. La conexión empieza con un handshake: el cliente hace una petición HTTP especial pidiendo «cambiar de protocolo» (upgrade); si el servidor acepta, esa misma conexión se convierte en un WebSocket y ya no habla HTTP, sino mensajes que van y vienen. En el navegador se usa con la API WebSocket, que emite eventos cuando la conexión abre, llega un mensaje, hay un error o se cierra. No siempre es la herramienta correcta: si solo necesitás que el servidor empuje datos en un sentido (por ejemplo, un feed de notificaciones), Server-Sent Events es más simple; y para datos que cambian poco, basta con pedir cada cierto tiempo (polling). WebSockets brilla cuando hace falta comunicación bidireccional, frecuente y de baja latencia. En producción hay que cuidar la reconexión (las conexiones se caen), la autenticación y la escala (muchas conexiones abiertas a la vez).

Ver índice de contenidos
  1. 01Qué es un WebSocket
  2. 02WebSocket frente a HTTP
  3. 03Cuándo usarlo (y cuándo no)
  4. 04Errores frecuentes
  5. 05Preguntas frecuentes
  6. 06Fuentes

Qué es un WebSocket

Un WebSocket es un protocolo que establece un canal permanente entre cliente y servidor sobre el que ambos pueden enviarse mensajes libremente. Se abre mediante un handshake: el navegador manda una petición HTTP con una cabecera que pide actualizar (upgrade) la conexión a WebSocket; si el servidor acepta, la conexión deja de ser HTTP y pasa a ser un flujo de mensajes en las dos direcciones.

Persistente y bidireccional

Las dos palabras que definen a un WebSocket son persistente (la conexión se abre una vez y se mantiene, en lugar de abrirse y cerrarse en cada intercambio) y bidireccional (o full-duplex: cliente y servidor pueden hablar al mismo tiempo, sin turnos). Esa combinación elimina la limitación fundamental de HTTP para el tiempo real: que el servidor no tenga forma de iniciar la comunicación. Con un WebSocket abierto, cuando el servidor tiene algo nuevo —un mensaje de chat, un cambio de precio— lo empuja al instante.

WebSocket frente a HTTP

La diferencia entre el modelo de comunicación de HTTP y el de los WebSockets, representada como dos esquemas comparados de cliente y servidor. En el esquema de HTTP se muestra el modelo de petición y respuesta: el cliente envía una petición al servidor y el servidor le devuelve una respuesta, tras lo cual la interacción concluye; se resalta que en este modelo la comunicación siempre la inicia el cliente, que el servidor no puede enviar datos por su cuenta sin que se le pregunte, y que para obtener información nueva el cliente tiene que volver a preguntar una y otra vez, lo que se ilustra con varias peticiones repetidas a lo largo del tiempo, técnica conocida como sondeo o polling, poco eficiente para datos que cambian con frecuencia. En el esquema de WebSocket se muestra primero el handshake inicial: el cliente envía una petición HTTP especial solicitando cambiar de protocolo, es decir, una petición de actualización o upgrade, y el servidor la acepta, momento a partir del cual la misma conexión se transforma en un canal WebSocket. A continuación se representa el canal ya establecido como una conexión única, persistente y abierta entre cliente y servidor, sobre la cual ambos extremos pueden enviarse mensajes libremente y en cualquier momento, en ambos sentidos, sin necesidad de volver a pedir nada; se resalta que el servidor puede empujar datos al cliente en cuanto tiene algo nuevo, como un mensaje de chat o una actualización de precio, lo que permite la comunicación en tiempo real con baja latencia. El diagrama contrapone así el ir y venir repetitivo y unidireccional en su iniciativa de HTTP frente al canal continuo y bidireccional de los WebSockets, y resalta que esta diferencia es la que hace a los WebSockets adecuados para aplicaciones en tiempo real como chats, notificaciones, paneles en vivo, juegos y edición colaborativa, mientras que HTTP sigue siendo apropiado para las interacciones normales de petición y respuesta. Estilo oscuro de programación, con los dos modelos representados uno al lado del otro, cada uno con sus flechas de comunicación entre cliente y servidor y sus etiquetas explicativas.
HTTP funciona por petición-respuesta: el cliente pregunta y el servidor contesta, sin poder iniciar la comunicación. El WebSocket, tras un handshake de «upgrade», deja una conexión persistente por la que ambos lados envían mensajes en cualquier momento.

La comparación deja clara la diferencia de modelo:

HTTPWebSocket
ModeloPetición y respuestaCanal persistente
DirecciónEl cliente inicia siempreBidireccional: ambos envían
ConexiónSe abre y se cierra por intercambioSe abre una vez y se mantiene
¿Empuja el servidor?No, hay que preguntarleSí, en cuanto tiene algo
Ideal paraCargar páginas, APIs normalesTiempo real: chats, notificaciones, vivo
// Cliente: un chat mínimo en el navegador con la API WebSocket
const socket = new WebSocket("wss://ejemplo.servidor/chat");

socket.addEventListener("open", () => {
  socket.send(JSON.stringify({ tipo: "hola", usuario: "Ana" }));
});

socket.addEventListener("message", (evento) => {   // el servidor empuja mensajes
  const datos = JSON.parse(evento.data);
  console.log("Nuevo mensaje:", datos);
});

socket.addEventListener("close", () => console.log("Conexión cerrada"));

Cuándo usarlo (y cuándo no)

WebSockets es potente, pero no es gratis: mantener conexiones abiertas consume recursos y añade complejidad (reconexión, escala, estado). La pregunta correcta es qué tipo de comunicación necesitás.

NecesidadTécnica recomendada
Comunicación bidireccional y frecuente (chat, juego)WebSockets
El servidor solo empuja en un sentido (notificaciones, feed)Server-Sent Events (más simple)
Datos que cambian poco y sin urgenciaPedir cada cierto tiempo (polling)
Operaciones normales (cargar, guardar)HTTP / API REST de siempre
!
Lo que se complica en producción

Un chat de ejemplo funciona en cinco minutos; un sistema en tiempo real real tiene aristas. Las conexiones se caen (redes móviles, suspensión del equipo), así que el cliente necesita reconexión automática con reintentos. Hay que autenticar la conexión —normalmente pasando un token en el handshake— y no confiar en que quede abierta como identidad. Y a escala, miles de conexiones simultáneas no caben en un solo servidor: se reparten entre varios, que necesitan compartir los mensajes entre sí. Nada de esto es insalvable, pero conviene saberlo antes de elegir WebSockets «porque es tiempo real».

Errores frecuentes

  • Usar WebSockets cuando bastaría HTTP o SSE. Si la comunicación es en un solo sentido o esporádica, añade complejidad sin necesidad.
  • No implementar reconexión. Las conexiones se caen; sin reintentos, la app deja de actualizarse en silencio.
  • No autenticar la conexión. Abrir un WebSocket sin verificar quién es deja el canal expuesto.
  • Confiar solo en el cliente. Validar en el servidor cada mensaje recibido, igual que en cualquier API.
  • Ignorar la escala. Miles de conexiones abiertas exigen repartir entre servidores y compartir mensajes entre ellos.
  • Usar ws:// sin cifrar en producción. Como con HTTP, debe ser wss:// (cifrado) para no exponer los datos.
  • No manejar el cierre ni los errores. Escuchar los eventos de cierre y error para reaccionar y limpiar recursos.

Preguntas frecuentes

¿Qué es un WebSocket?

Un WebSocket es un protocolo de comunicación que establece un canal permanente y bidireccional entre un cliente, habitualmente un navegador web, y un servidor, permitiendo que ambos se envíen mensajes libremente y en cualquier momento mientras la conexión permanece abierta. Su característica esencial es que, a diferencia del modelo tradicional de la web, la conexión se abre una sola vez y se mantiene activa, en lugar de abrirse y cerrarse en cada intercambio, y además la comunicación puede fluir en ambos sentidos de forma simultánea, lo que se conoce como comunicación full dúplex. La conexión de un WebSocket comienza con un proceso llamado handshake o apretón de manos: el navegador envía al servidor una petición que aprovecha inicialmente el protocolo HTTP pero que incluye una indicación especial solicitando actualizar o cambiar el protocolo de la conexión hacia WebSocket; si el servidor está de acuerdo y responde aceptando ese cambio, la misma conexión se transforma en un canal WebSocket y a partir de ese momento deja de comportarse como una serie de peticiones y respuestas HTTP para convertirse en un flujo continuo de mensajes que van y vienen entre ambos extremos. Lo que hace tan valioso a este mecanismo es que resuelve una limitación fundamental de la web tradicional, en la que el servidor no puede tomar la iniciativa de enviar información al cliente sin que este se la pida primero; con un WebSocket abierto, el servidor puede empujar datos al cliente en el mismo instante en que tiene algo nuevo que comunicar, como la llegada de un mensaje, un cambio en un marcador o una actualización de un precio. Esta capacidad de comunicación instantánea y en ambos sentidos es la base sobre la que se construyen las aplicaciones en tiempo real, como los chats, los sistemas de notificaciones que aparecen solas, los paneles de datos en vivo, las plataformas de edición colaborativa o los juegos multijugador, en las que la inmediatez y la comunicación continua entre las partes son imprescindibles.

¿En qué se diferencia un WebSocket de HTTP?

La diferencia fundamental entre un WebSocket y HTTP está en el modelo de comunicación que utiliza cada uno. HTTP funciona según un modelo de petición y respuesta: el cliente envía una petición al servidor, el servidor procesa esa petición y devuelve una respuesta, y con eso la interacción concluye, cerrándose la conexión o quedando disponible para otra petición independiente. En este modelo, la comunicación siempre la inicia el cliente, y el servidor nunca puede enviar información por su cuenta sin que antes se le haya preguntado algo; si el cliente quiere estar al tanto de cambios o novedades, no le queda más remedio que volver a preguntar una y otra vez, una técnica conocida como sondeo o polling, que resulta poco eficiente cuando los datos cambian con frecuencia o cuando se necesita inmediatez, porque implica muchas peticiones, muchas de ellas sin novedades, y una latencia dependiente del intervalo entre consultas. Un WebSocket, en cambio, establece tras un breve proceso de negociación inicial una conexión única, persistente y abierta entre cliente y servidor, sobre la cual ambos extremos pueden enviarse mensajes en cualquier momento y en ambas direcciones sin necesidad de volver a pedir nada. Esto significa que el servidor puede empujar datos al cliente en el instante mismo en que ocurre algo relevante, lo que proporciona una comunicación en tiempo real con muy baja latencia y sin el desperdicio de las peticiones repetidas del sondeo. Otra diferencia práctica es que HTTP, al abrir y cerrar conexiones y transportar cabeceras en cada intercambio, tiene una sobrecarga por mensaje mayor, mientras que un WebSocket, una vez establecido, intercambia mensajes con muy poca sobrecarga. No obstante, cada uno tiene su terreno: HTTP sigue siendo la opción adecuada y sencilla para las interacciones normales de la web, como cargar páginas, enviar formularios o consumir una API cuando la comunicación es esporádica y la inicia el cliente, mientras que los WebSockets destacan cuando se necesita comunicación bidireccional, frecuente y de baja latencia. De hecho, ambos conviven en las aplicaciones modernas, que usan HTTP para las operaciones convencionales y WebSockets para las funciones en tiempo real.

¿Para qué tipo de aplicaciones se usan los WebSockets?

Los WebSockets se usan para aquellas aplicaciones o funcionalidades que necesitan comunicación en tiempo real entre el cliente y el servidor, es decir, situaciones en las que la información debe fluir de forma inmediata y a menudo en ambos sentidos, sin que el usuario tenga que recargar ni el cliente tenga que preguntar repetidamente. Un ejemplo muy típico son las aplicaciones de chat y mensajería, en las que los mensajes deben aparecer al instante para todos los participantes en cuanto alguien los envía, algo que encaja perfectamente con la capacidad del servidor de empujar datos a los clientes conectados. Otro caso habitual son los sistemas de notificaciones en tiempo real, en los que el servidor avisa al usuario en el momento en que ocurre un evento relevante, sin que este tenga que estar consultando. También se emplean en paneles y cuadros de mando en vivo que muestran datos que cambian continuamente, como marcadores deportivos, cotizaciones financieras, seguimiento de envíos, métricas de sistemas o resultados de votaciones, donde ver la actualización al instante es parte del valor. Las herramientas de edición y trabajo colaborativo, en las que varias personas modifican simultáneamente un mismo documento, hoja de cálculo o diseño y ven los cambios de los demás en tiempo real, son otro ámbito natural para los WebSockets, ya que requieren un flujo constante y bidireccional de actualizaciones. Los juegos multijugador en línea, especialmente los que necesitan sincronización rápida entre jugadores, también se apoyan en este tipo de comunicación de baja latencia. Y en general cualquier funcionalidad que implique presencia, como mostrar quién está conectado o escribiendo, o cualquier interacción que deba reflejarse de inmediato en otros usuarios, es candidata a usar WebSockets. Conviene recordar, no obstante, que no todas las funciones que parecen de tiempo real requieren necesariamente WebSockets, ya que cuando la comunicación va en un solo sentido, del servidor al cliente, a veces basta con una técnica más simple, y cuando los datos cambian poco o sin urgencia, puede ser suficiente con consultar cada cierto tiempo; los WebSockets brillan realmente cuando se necesita una comunicación bidireccional, frecuente y con la menor latencia posible.

¿Cuándo no conviene usar WebSockets?

Aunque los WebSockets son muy potentes para la comunicación en tiempo real, no siempre son la mejor opción, y usarlos donde no hacen falta añade complejidad y consumo de recursos innecesarios, por lo que conviene conocer los casos en los que es preferible otra técnica. En primer lugar, cuando la comunicación va únicamente en un sentido, del servidor hacia el cliente, y no se necesita que el cliente envíe mensajes de forma continua por el mismo canal, como ocurre con un feed de notificaciones, una cotización que solo se muestra o actualizaciones que el servidor difunde, suele ser preferible una técnica más simple pensada precisamente para eso, en la que el servidor puede empujar datos al cliente sobre una conexión más ligera y fácil de manejar, con reconexión automática incorporada, sin la complejidad completa de un canal bidireccional. En segundo lugar, cuando los datos cambian con poca frecuencia o sin urgencia, puede ser más que suficiente que el cliente consulte al servidor cada cierto tiempo mediante peticiones normales, ya que mantener una conexión permanente abierta para algo que se actualiza raramente es un desperdicio de recursos. En tercer lugar, para las operaciones convencionales de una aplicación, como cargar una página, enviar un formulario, guardar datos o consumir una API en interacciones puntuales iniciadas por el usuario, el modelo tradicional de petición y respuesta es más sencillo, más fácil de cachear, de escalar y de depurar, y no hay razón para sustituirlo por WebSockets. Además, hay que tener en cuenta que los WebSockets implican mantener muchas conexiones abiertas simultáneamente, lo que consume recursos del servidor y complica el escalado, ya que hay que repartir esas conexiones entre varios servidores y compartir los mensajes entre ellos, y también requieren gestionar cuestiones como la reconexión cuando la conexión se cae y la autenticación del canal, todo lo cual añade complejidad al proyecto. Por tanto, la recomendación es reservar los WebSockets para los casos en los que realmente se necesita comunicación bidireccional, frecuente y de baja latencia, y optar por alternativas más simples cuando la naturaleza de la comunicación lo permita, eligiendo siempre la herramienta más adecuada y menos compleja que resuelva bien el problema concreto.

¿Cómo se establece una conexión WebSocket?

Una conexión WebSocket se establece mediante un proceso inicial llamado handshake o apretón de manos, que curiosamente comienza aprovechando el protocolo HTTP para después transformarse en una conexión WebSocket. El proceso arranca cuando el cliente, normalmente el navegador, envía al servidor una petición que en apariencia es una petición HTTP pero que incluye unas cabeceras especiales, en particular una que indica que se desea actualizar o cambiar el protocolo de la conexión, solicitando pasar de HTTP a WebSocket, junto con cierta información de negociación. Si el servidor admite WebSockets y acepta la solicitud, responde con una respuesta específica que confirma el cambio de protocolo, y a partir de ese instante la conexión ya establecida deja de comportarse como HTTP y se convierte en un canal WebSocket persistente y bidireccional, sobre el cual cliente y servidor pueden intercambiar mensajes libremente sin repetir el proceso de negociación. Una vez abierto el canal, en el lado del navegador se trabaja con una interfaz que representa la conexión y que funciona mediante eventos: se produce un evento cuando la conexión se abre correctamente, otro cada vez que llega un mensaje desde el servidor, otro si ocurre un error y otro cuando la conexión se cierra, y para enviar información al servidor se dispone de una operación de envío. De este modo, el programa reacciona a la apertura para, por ejemplo, enviar un mensaje inicial de presentación o autenticación, reacciona a cada mensaje entrante para procesarlo y actualizar la interfaz, y reacciona al cierre o a los errores para gestionar la situación, por ejemplo intentando reconectar. En cuanto a la seguridad, al igual que existe una versión cifrada de HTTP, existe una versión cifrada de WebSocket que debe usarse siempre en producción para que los datos viajen protegidos, distinguiéndose por su identificador de conexión seguro frente al no cifrado. En un escenario real, además del propio establecimiento de la conexión, es importante ocuparse de aspectos como autenticar quién se conecta, habitualmente enviando un token durante o justo después del handshake, gestionar la reconexión automática cuando el canal se cae, y en el lado del servidor manejar adecuadamente el conjunto de conexiones abiertas. Todo ello convierte el establecimiento y mantenimiento de una conexión WebSocket en algo sencillo de iniciar pero que requiere cuidado para funcionar de forma robusta en producción.

¿Qué desafíos tienen los WebSockets en producción?

Los WebSockets, que resultan muy sencillos de poner en marcha en un ejemplo básico, presentan varios desafíos importantes cuando se llevan a un entorno de producción real con muchos usuarios, y conocerlos de antemano es clave para construir un sistema en tiempo real robusto. El primer desafío es la gestión de la reconexión, ya que las conexiones persistentes tienden a caerse por múltiples motivos, como cambios de red en dispositivos móviles, la suspensión de un equipo, cortes temporales de conectividad o tiempos de espera de intermediarios de red; si el cliente no implementa una lógica de reconexión automática con reintentos, la aplicación dejaría de recibir actualizaciones de forma silenciosa, dando la falsa impresión de que sigue funcionando. El segundo desafío es la autenticación y la seguridad del canal, puesto que hay que verificar quién está detrás de cada conexión, habitualmente enviando un token durante o inmediatamente después del handshake y validándolo en el servidor, además de usar siempre la variante cifrada del protocolo en producción para que los datos viajen protegidos, y de validar en el servidor todos los mensajes recibidos sin confiar en el cliente, igual que en cualquier interfaz de programación. El tercer desafío, y uno de los más exigentes, es la escalabilidad, ya que a diferencia de las peticiones HTTP normales, que son breves y sin estado, los WebSockets mantienen abiertas simultáneamente tantas conexiones como usuarios haya conectados, lo que consume memoria y recursos del servidor y hace que un único servidor no baste cuando el número de usuarios crece; entonces es necesario repartir las conexiones entre varios servidores y, dado que un mensaje que debe llegar a un usuario puede originarse en un servidor distinto de aquel al que ese usuario está conectado, hace falta un mecanismo que comparta y distribuya los mensajes entre todos los servidores, lo que suele resolverse con un sistema intermedio de publicación y suscripción. A estos desafíos se suman otros aspectos, como manejar correctamente el cierre de las conexiones y liberar recursos, controlar el estado de presencia de los usuarios, gestionar la carga y evitar saturaciones, y considerar el comportamiento frente a intermediarios de red y cortafuegos. Ninguno de estos retos es insalvable, y existen bibliotecas y servicios que ayudan a afrontarlos, pero conviene tenerlos presentes desde el principio para no subestimar la complejidad de un sistema en tiempo real serio frente a la sencillez engañosa de un primer ejemplo.

Fuentes

Documentación oficial y material de la comunidad consultados para esta guía. Fecha de consulta: 28 de julio de 2026.

Aportes de la comunidad Underc0de

  1. Underc0de, foro. Sección Desarrollo web. Aplicaciones interactivas.
  2. Underc0de, foro. Sección Programación. Comunicación en red.

Documentación oficial

  1. MDN. The WebSocket API. Referencia de la API de WebSockets.
  2. IETF. RFC 6455: The WebSocket Protocol. Especificación del protocolo.
  3. MDN. Server-sent events. Alternativa unidireccional para comparar.
  4. WHATWG. WebSockets Standard. Estándar de la interfaz WebSocket.