Ir al contenido principal
Versión: 4.x

Visión general de la API

Antes de continuar, hagamos un recorrido rápido por la API proporcionada por Socket.IO:

API común

Los siguientes métodos están disponibles tanto para el cliente como para el servidor.

Emit básico

Como vimos en el paso #4, puedes enviar cualquier dato al otro lado con socket.emit():

Cliente

socket.emit('hello', 'world');

Servidor

io.on('connection', (socket) => {
socket.on('hello', (arg) => {
console.log(arg); // 'world'
});
});

Puedes enviar cualquier número de argumentos, y todas las estructuras de datos serializables son soportadas, incluyendo objetos binarios como ArrayBuffer, TypedArray o Buffer (solo Node.js):

Cliente

socket.emit('hello', 1, '2', { 3: '4', 5: Uint8Array.from([6]) });

Servidor

io.on('connection', (socket) => {
socket.on('hello', (arg1, arg2, arg3) => {
console.log(arg1); // 1
console.log(arg2); // '2'
console.log(arg3); // { 3: '4', 5: <Buffer 06> }
});
});
consejo

No es necesario llamar JSON.stringify() en objetos:

// MAL
socket.emit('hello', JSON.stringify({ name: 'John' }));

// BIEN
socket.emit('hello', { name: 'John' });

Acknowledgements

Los eventos son geniales, pero en algunos casos puedes querer una API de solicitud-respuesta más clásica. En Socket.IO, esta característica se llama "acknowledgements".

Viene en dos sabores:

Con una función callback

Puedes añadir un callback como el último argumento del emit(), y este callback será llamado una vez que el otro lado haya reconocido el evento:

Cliente

socket.timeout(5000).emit('request', { foo: 'bar' }, 'baz', (err, response) => {
if (err) {
// el servidor no reconoció el evento en el tiempo dado
} else {
console.log(response.status); // 'ok'
}
});

Servidor

io.on('connection', (socket) => {
socket.on('request', (arg1, arg2, callback) => {
console.log(arg1); // { foo: 'bar' }
console.log(arg2); // 'baz'
callback({
status: 'ok'
});
});
});

Con una Promise

El método emitWithAck() proporciona la misma funcionalidad, pero devuelve una Promise que se resolverá una vez que el otro lado reconozca el evento:

Cliente

try {
const response = await socket.timeout(5000).emitWithAck('request', { foo: 'bar' }, 'baz');
console.log(response.status); // 'ok'
} catch (e) {
// el servidor no reconoció el evento en el tiempo dado
}

Servidor

io.on('connection', (socket) => {
socket.on('request', (arg1, arg2, callback) => {
console.log(arg1); // { foo: 'bar' }
console.log(arg2); // 'baz'
callback({
status: 'ok'
});
});
});
precaución

Los entornos que no soportan Promises (como Internet Explorer) necesitarán añadir un polyfill o usar un compilador como babel para usar esta característica (pero esto está fuera del alcance de este tutorial).

Listeners catch-all

Un listener catch-all es un listener que será llamado para cualquier evento entrante. Esto es útil para depurar tu aplicación:

Emisor

socket.emit('hello', 1, '2', { 3: '4', 5: Uint8Array.from([6]) });

Receptor

socket.onAny((eventName, ...args) => {
console.log(eventName); // 'hello'
console.log(args); // [ 1, '2', { 3: '4', 5: ArrayBuffer (1) [ 6 ] } ]
});

De manera similar, para paquetes salientes:

socket.onAnyOutgoing((eventName, ...args) => {
console.log(eventName); // 'hello'
console.log(args); // [ 1, '2', { 3: '4', 5: ArrayBuffer (1) [ 6 ] } ]
});

API del servidor

Broadcasting

Como vimos en el paso #5, puedes difundir un evento a todos los clientes conectados con io.emit():

io.emit('hello', 'world');
El evento 'hello' se envía a todos los clientes conectadosEl evento 'hello' se envía a todos los clientes conectados

Rooms

En la jerga de Socket.IO, una room es un canal arbitrario al que los sockets pueden unirse y abandonar. Se puede usar para difundir eventos a un subconjunto de clientes conectados:

io.on('connection', (socket) => {
// unirse a la sala llamada 'some room'
socket.join('some room');

// difundir a todos los clientes conectados en la sala
io.to('some room').emit('hello', 'world');

// difundir a todos los clientes conectados excepto los de la sala
io.except('some room').emit('hello', 'world');

// abandonar la sala
socket.leave('some room');
});
El evento 'hello' se envía a todos los clientes conectados en la sala objetivoEl evento 'hello' se envía a todos los clientes conectados en la sala objetivo

¡Eso es básicamente todo! Para referencia futura, la API completa se puede encontrar aquí (servidor) y aquí (cliente).