Ir al contenido principal
Versión: 4.x

Introducción

consejo

Si eres nuevo en Socket.IO, te recomendamos revisar nuestro tutorial.

Qué es Socket.IO

Socket.IO es una biblioteca que permite la comunicación de baja latencia, bidireccional y basada en eventos entre un cliente y un servidor.

Diagrama de comunicación entre un servidor y un clienteDiagrama de comunicación entre un servidor y un cliente

La conexión de Socket.IO puede establecerse con diferentes transportes de bajo nivel:

Socket.IO seleccionará automáticamente la mejor opción disponible, dependiendo de:

  • las capacidades del navegador (ver aquí y aquí)
  • la red (algunas redes bloquean conexiones WebSocket y/o WebTransport)

Puedes encontrar más detalles sobre esto en la sección "Cómo funciona".

Implementaciones del servidor

LenguajeSitio web
JavaScript (Node.js)- Pasos de instalación
- API
- Código fuente
JavaScript (Deno)https://github.com/socketio/socket.io-deno
Javahttps://github.com/mrniko/netty-socketio
Javahttps://github.com/trinopoty/socket.io-server-java
Pythonhttps://github.com/miguelgrinberg/python-socketio
Golanghttps://github.com/googollee/go-socket.io
Rusthttps://github.com/Totodore/socketioxide

Implementaciones del cliente

LenguajeSitio web
JavaScript (navegador, Node.js o React Native)- Pasos de instalación
- API
- Código fuente
JavaScript (para Mini-Programas de WeChat)https://github.com/weapp-socketio/weapp.socket.io
Javahttps://github.com/socketio/socket.io-client-java
C++https://github.com/socketio/socket.io-client-cpp
Swifthttps://github.com/socketio/socket.io-client-swift
Darthttps://github.com/rikulo/socket.io-client-dart
Pythonhttps://github.com/miguelgrinberg/python-socketio
.Nethttps://github.com/doghappy/socket.io-client-csharp
Rusthttps://github.com/1c3t3a/rust-socketio
Kotlinhttps://github.com/icerockdev/moko-socket-io
PHPhttps://github.com/ElephantIO/elephant.io
Golanghttps://github.com/maldikhan/go.socket.io

Qué NO es Socket.IO

precaución

Socket.IO NO es una implementación de WebSocket.

Aunque Socket.IO efectivamente usa WebSocket para el transporte cuando es posible, agrega metadatos adicionales a cada paquete. Es por eso que un cliente WebSocket no podrá conectarse exitosamente a un servidor Socket.IO, y un cliente Socket.IO tampoco podrá conectarse a un servidor WebSocket simple.

// ADVERTENCIA: ¡el cliente NO podrá conectarse!
const socket = io("ws://echo.websocket.org");

Si estás buscando un servidor WebSocket simple, por favor echa un vistazo a ws o µWebSockets.js.

También hay discusiones para incluir un servidor WebSocket en el núcleo de Node.js.

En el lado del cliente, podrías estar interesado en el paquete robust-websocket.

precaución

Socket.IO no está pensado para ser usado en un servicio en segundo plano para aplicaciones móviles.

La biblioteca Socket.IO mantiene una conexión TCP abierta al servidor, lo que puede resultar en un alto consumo de batería para tus usuarios. Por favor usa una plataforma de mensajería dedicada como FCM para este caso de uso.

Características

Aquí están las características que proporciona Socket.IO sobre WebSockets simples:

Fallback a HTTP long-polling

La conexión recurrirá a HTTP long-polling en caso de que no se pueda establecer la conexión WebSocket.

Esta característica fue la razón #1 por la que la gente usaba Socket.IO cuando el proyecto fue creado hace más de diez años (!), ya que el soporte del navegador para WebSockets todavía estaba en sus inicios.

Aunque la mayoría de los navegadores ahora soportan WebSockets (más del 97%), sigue siendo una gran característica ya que todavía recibimos informes de usuarios que no pueden establecer una conexión WebSocket porque están detrás de algún proxy mal configurado.

Reconexión automática

Bajo algunas condiciones particulares, la conexión WebSocket entre el servidor y el cliente puede interrumpirse sin que ambos lados estén conscientes del estado roto del enlace.

Es por eso que Socket.IO incluye un mecanismo de heartbeat, que verifica periódicamente el estado de la conexión.

Y cuando el cliente finalmente se desconecta, se reconecta automáticamente con un retraso de retroceso exponencial, para no sobrecargar el servidor.

Almacenamiento en búfer de paquetes

Los paquetes se almacenan automáticamente en búfer cuando el cliente está desconectado, y se enviarán tras la reconexión.

Más información aquí.

Confirmaciones (Acknowledgements)

Socket.IO proporciona una forma conveniente de enviar un evento y recibir una respuesta:

Emisor

socket.emit("hello", "world", (response) => {
console.log(response); // "recibido"
});

Receptor

socket.on("hello", (arg, callback) => {
console.log(arg); // "world"
callback("recibido");
});

También puedes agregar un tiempo de espera:

socket.timeout(5000).emit("hello", "world", (err, response) => {
if (err) {
// el otro lado no confirmó el evento en el tiempo dado
} else {
console.log(response); // "recibido"
}
});

Broadcasting

En el lado del servidor, puedes enviar un evento a todos los clientes conectados o a un subconjunto de clientes:

// a todos los clientes conectados
io.emit("hello");

// a todos los clientes conectados en la sala "news"
io.to("news").emit("hello");

Esto también funciona cuando se escala a múltiples nodos.

Multiplexación

Los namespaces te permiten dividir la lógica de tu aplicación sobre una única conexión compartida. Esto puede ser útil, por ejemplo, si quieres crear un canal de "admin" al que solo puedan unirse usuarios autorizados.

io.on("connection", (socket) => {
// usuarios clásicos
});

io.of("/admin").on("connection", (socket) => {
// usuarios administradores
});

Más información sobre esto aquí.

Preguntas comunes

¿Socket.IO sigue siendo necesario hoy en día?

Es una pregunta justa, ya que WebSockets es soportado casi en todas partes ahora.

Dicho esto, creemos que si usas WebSockets simples para tu aplicación, eventualmente necesitarás implementar la mayoría de las características que ya están incluidas (y probadas en batalla) en Socket.IO, como reconexión, confirmaciones o broadcasting.

¿Cuál es la sobrecarga del protocolo Socket.IO?

socket.emit("hello", "world") se enviará como un único frame WebSocket conteniendo 42["hello","world"] con:

  • 4 siendo el tipo de paquete "message" de Engine.IO
  • 2 siendo el tipo de paquete "message" de Socket.IO
  • ["hello","world"] siendo la versión JSON.stringify() del array de argumentos

Así que, unos pocos bytes adicionales por cada mensaje, que pueden reducirse aún más mediante el uso de un parser personalizado.

información

El tamaño del bundle del navegador en sí es de 10.4 kB (minificado y comprimido con gzip).

Puedes encontrar los detalles del protocolo Socket.IO aquí.

¿Algo no funciona correctamente, pueden ayudarme?

Por favor revisa nuestra Guía de solución de problemas.

Próximos pasos