Fundamentos de Sockets
sockets
El problema
Imaginemos que tenemos esta arquitectura: un servidor donde corre nuestra aplicación Node y una computadora cliente.
Normalmente lo que vamos a hacer es una petición http de tipo GET y el servidor me va a devolver información. Por ejemplo: devuelve un usuario, los datos de ese usuario, la información de un chat. El servidor responderá con una respuesta (exitosa o fallida). Se genera la pantalla del chat, se muestra la información de la persona, lo que sea, pero más adelante el servidor puede darse cuenta de que la información que envió se actualizó de alguna manera. Hay nuevos mensajes en el chat o cambió el perfil del usuario solicitado.
Acá es donde está el problema. El servidor no va a poder avisarle a la computadora cliente: “Che, tengo información nueva que te interesa.” No puede hacer eso directamente hasta que el usuario haga otra petición.
Ahora pensemos si quisiéramos establecer una comunicación con otra computadora, por ejemplo, enviar un mensaje privado como en Facebook, Twitter, etc.
Si quisiéramos enviar un mensaje privado, básicamente uno tiene que primero enviar el mensaje al servidor y el servidor determina a qué usuario enviárselo, y luego le envía el mensaje a ese usuario.
¿Ya vemos el problema? Si tuviéramos la misma arquitectura que la de la imagen, ambas máquinas deberían estar constantemente haciendo peticiones para ver si hay mensajes nuevos para ellas.
Sería interesante que el servidor pudiera disparar una notificación diciendo que hay información nueva que le interesa a un usuario en particular.
Y básicamente eso son los sockets.
Sockets
Un socket nos permite mantener una comunicación activa entre la máquina cliente y el servidor. Es decir, el servidor puede disparar notificaciones a la máquina cliente y esta puede interactuar con lo que el servidor responda.
Generalmente podemos enviar strings, booleanos, números, o un objeto entero. Esto nos permite recibir notificaciones en tiempo real. Por ejemplo, te conectás desde una computadora nueva y se establece una comunicación activa. También se podría enviar un mensaje desde la máquina uno a la máquina dos a través del servidor, y la notificación sería instantánea.
Ninguna de las dos máquinas debería estar haciendo peticiones para obtener esa información, sino que ambas computadoras serán notificadas cuando reciban un mensaje en particular.
Ahora bien, con sockets no solo podemos hacer eso, también podemos ser notificados cuando un usuario se desconecta, como por ejemplo “Maciel se desconectó del chat”. También cuando se conecta un usuario nuevo: “Bienvenido, Maciel”.
O notificar a todos que alguien se unió a la sesión del chat. Y algo muy importante también es que vamos a saber cuándo un usuario se reconecta.
Sabemos que Internet puede fallar, y en este caso el uso de sockets es súper útil porque el usuario puede reconectarse y retomar la misma sesión en la que estaba trabajando antes.
Los demás usuarios van a poder saber que tal persona se reconectó. Y quizás lo más importante, lo que hace que los sockets sean extremadamente flexibles, es que vamos a poder disparar eventos personalizados. Estos eventos personalizados son lo que vos quieras hacer.
Por ejemplo, si tenés un gráfico, podés recibir una notificación del servidor cuando haya información nueva que lo modifique. Si fuera un chat, podríamos ser notificados cuando hay mensajes nuevos.
En definitiva, con eventos personalizados podés hacer lo que quieras.