Introducción
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.


La conexión de Socket.IO puede establecerse con diferentes transportes de bajo nivel:
- HTTP long-polling
- WebSocket
- WebTransport
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
| Lenguaje | Sitio web |
|---|---|
| JavaScript (Node.js) | - Pasos de instalación - API - Código fuente |
| JavaScript (Deno) | https://github.com/socketio/socket.io-deno |
| Java | https://github.com/mrniko/netty-socketio |
| Java | https://github.com/trinopoty/socket.io-server-java |
| Python | https://github.com/miguelgrinberg/python-socketio |
| Golang | https://github.com/googollee/go-socket.io |
| Rust | https://github.com/Totodore/socketioxide |
Implementaciones del cliente
| Lenguaje | Sitio 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 |
| Java | https://github.com/socketio/socket.io-client-java |
| C++ | https://github.com/socketio/socket.io-client-cpp |
| Swift | https://github.com/socketio/socket.io-client-swift |
| Dart | https://github.com/rikulo/socket.io-client-dart |
| Python | https://github.com/miguelgrinberg/python-socketio |
| .Net | https://github.com/doghappy/socket.io-client-csharp |
| Rust | https://github.com/1c3t3a/rust-socketio |
| Kotlin | https://github.com/icerockdev/moko-socket-io |
| PHP | https://github.com/ElephantIO/elephant.io |
| Golang | https://github.com/maldikhan/go.socket.io |
Qué NO es Socket.IO
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.
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:
4siendo el tipo de paquete "message" de Engine.IO2siendo el tipo de paquete "message" de Socket.IO["hello","world"]siendo la versiónJSON.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.
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.