WebSockets y SocketIO
Si todavía no arrancaste a ver la magia del protocolo WS (web socket) este post intenta meterte en tema.
Qué es WebSocket?
WebSocket es un protocolo nuevo para la web bajo TCP, por el cual, a diferencia de la conexión que venimos usando bajo HTTP, este es bi-direccional, que significa esto?, hoy por hoy venís usando una conexión en una sola dirección, pedís al servidor y esperas la respuesta (o viceversa con ServerEvents). Pero con web sockets el servidor te habla también, te puede llamar y mandar un mensaje en cualquier momento.
Esto es genial, ya que las posibilidades de magia en un sito web aumentan considerablemente, pero hay que tener en cuenta algunas cosas, ya que son Web Sockets:
- Se inicia con un handshake HTTP, por lo que si no hay HTTP no hay WebSockets
- Tanto servidor como cliente tienen que soportarlo (para eso tenemos a HTML 5 en cliente y SocketIO en el servicor 😛 )
- Sólo podemos transmitir texto/ JSON (a diferencia del TCP convencional en el que podemos transmitir streams de bytes)
- La conexión TCP va por el puerto 80 (lo cual está bueno en algunos casos donde tenemos firewalls)
- Así como tenemos HTTPS (seguros), podemos tener WSS jeje, pero no todos los navegadores que soportan WS, también soportan WSS
Cómo funciona?
Para iniciar una conexión con el protocolo WS primero el cliente le pide al servidor que quiere iniciar esta conexión (handshake: se pasan unos secretitos para validarse), el servidor responde un “dale para adelante” y a partir de ahí dejan de utilizar HTTP y pasan a WS.
Aparte de darnos está posibilidad de una conexión bi-direccional, nos ahorramos el “payload”, es decir, en estas transmiciones que hacemos por el protocolo ws ya no tenemos el HTTP header y toda la data de “info” para que el servidor sepa que le enviamos y nosotros que recibimos, qué tipo de conexión usamos, etc.
Tengamos en cuenta que transmitimos texto y nos quedamos enganchados al servidor hasta que nosotros como clientes decidamos que no queremos estar mas comunicados.
Ahora que ya sabemos de que se trata, vamos a utilizarlo.
SocketIO es una biblioteca que nos facilita increíblemente el uso de web sockets en NodeJS.
Así que arranquemos a configurar:
Instalamos el paquete NPM de SocketIO y ya que estamos instalamos el de ExpressJS para nuestro servidor Web:
Creamos un server.js donde vamos a levantar nuestro servidor Express con soporte para WebSocket
Ahora creamos un index.html que es el que retorna el servidor con la conexión a WebSocket
Lo que nos queda es correr el servidor web
Abrimos un navegador y llamamos a http://localhost y listo! (abrí la consola para ver las llamadas del servidor con los randoms ).
Al principio expliqué que tanto el cliente como el servidor deben soportar web sockets, tenemos que tener en cuenta que es necesario HTML5 con web sockets, te dejo este LINK con el detalle de los navegadores que lo soportan. Fuera de eso tené en cuenta que SocketIO se encarga de que la conexión funcione sin importar el navegador, esto lo hace intentando con otros mecanismos de transporte (XHR Pooling, Flash Sockets, etc.). No va a ser con web sockets pero va a funcionar como si lo fuera
Te dejo el código del ejemplo – ejemplo.zip
Toma este código como un ejemplo muy simple y básico de SocketIO, se pueden hacer muchísimas cosas más, como armar rooms o agrupar clientes por ruta de URI, emitir mensajes a todos o sólo al que le habló al servidor, etc.
Te recomiendo que veas mas ejemplos en el sitio de socket.io: how to use