Calendar Icon - Dark X Webflow Template
October 2023
Clock Icon - Dark X Webflow Template
7
min lectura

Los sockets y su evolucion a traves del tiempo

Para empezar a abordar este tema debemos definir que es un socket un socket es un punto final de una conexión entre dos programas que se comunican a través de una red, para esto se requiere de una dirección ip (dada por el sistema operativo) y de un puerto.

Nota: No usar los puertos del 0 al 1023 ya que estos son puertos conocidos y frecuentemente están en uso por el sistema.

Los sockets requieren de un servidor y N cantidad de usuarios, de forma que una vez inicializado el servidor, los clientes podrán conectarse al mismo y empezarán a interactuar. Esto no suena diferente de una petición tipo REST, resulta que las peticiones tipo rest hacen uso de los sockets, pero está tan encapsulado todo que solo podemos realizar la petición y esperar la respuesta, eso quiere decir que si el cliente no realiza una petición, el servidor nunca responderá.

La principal ventaja que tenemos al programar directamente con sockets es que podemos enviar datos sin una petición previa, lo que nos da comunicación en tiempo real para nuestro servidor y los clientes conectados al mismo. Esto quiere decir que el servidor podrá enviar información sin que el cliente haga una petición, y el cliente podrá enviar una petición sin esperar respuesta o limitarse a solo escuchar.

Sockets tradicionales

Son la forma más básica de comunicación de red en la programación. Se utilizan principalmente para comunicación en modo texto o binario entre un cliente y un servidor. Sin embargo, no están diseñados específicamente para la comunicación en tiempo real y tienen limitaciones en ese sentido.

  • Socket de Flujo (Stream Socket o SOCK_STREAM): Este tipo de socket se utiliza para la comunicación orientada a la conexión, como la comunicación TCP (Protocolo de Control de Transmisión). Proporciona una conexión bidireccional y confiable entre dos puntos finales. Los datos se envían en un flujo continuo y se asegura que lleguen en el orden correcto.

  • Socket de Datagrama (Datagram Socket o SOCK_DGRAM): Este tipo de socket se utiliza para la comunicación no orientada a la conexión, como la comunicación UDP (Protocolo de Datagramas de Usuario). Los sockets de datagrama permiten el envío de paquetes independientes que pueden llegar en un orden diferente al que se enviaron y pueden incluso perderse en tránsito. Es útil cuando la velocidad de transmisión es más importante que la integridad de los datos.

Ventajas:

  • Control total: al desarrollar en los sockets más básicos, tu manejas el cómo se enviaran y usarán los datos
  • Eficiencia: No requieren de muchos recursos para funcionar, no lleva procesos innecesarios y los datos que se reciben son exactos

Desventajas:

  • Alta complejidad: No tienen implementadas algunas funciones que ofrecen otros tipos de sockets por lo que se deben de definir desde cero.
  • Alta probabilidad de errores: Dependiendo del tipo de socket 

WebSockets

Con la llegada de los websockets se vio una evolución, fueron introducidos con la tecnología HTML5 y permiten la comunicación en tiempo real bidireccional, fue utilizado bastante en chats, videojuegos y diversas aplicaciones.

Ventajas:

  • La comunicación es bidireccional
  • Tienen baja latencia
  • Eficiencia en el envío de datos (Manejan una sobrecarga de datos menor)
  • Compatibilidad con múltiples plataformas

Desventajas

  • Dificultad para escalar: Consume recursos del servidor Por cada cliente
  • Seguridad: Es fácil que una mala configuración de estos dejen vulnerable a tu sistema.
  • Pérdida de información: los websockets no garantizan que la información llegue en orden o que haya sido recibida por el cliente, por lo que podría llegar a perderse.

SocketIO

Socket.IO es una biblioteca que proporciona una capa de abstracción sobre WebSockets y otras tecnologías de transporte, lo que la hace popular en aplicaciones que requieren comunicación en tiempo real. A diferencia de los websockets, los SocketIO además de manejar endpoints también permiten manejar eventos, esto quiere decir que pueden tener un solo endpoint, pero puedes tener varios eventos, a su vez puedes enviar distintos tipos de datos, desde argumentos hasta Json que permite el paso de datos de manera más eficiente.

Ventajas:

  • Comunicación en Tiempo Real: Socket.IO facilita la comunicación bidireccional en tiempo real entre el cliente y el servidor, lo que es esencial para aplicaciones que requieren actualizaciones instantáneas
  • Amplio Soporte de Plataformas y Lenguajes: Socket.IO es compatible con múltiples plataformas y lenguajes de programación, incluidos Node.js, JavaScript en el lado del cliente, Python, Java, C#, y más
  • Escalabilidad: Socket.IO se puede configurar para funcionar en entornos de alta carga y escalar para manejar un gran número de conexiones simultáneas, lo que lo hace adecuado para aplicaciones de alto tráfico.
  • Baja Latencia: Socket.IO proporciona baja latencia, lo que significa que los datos pueden transmitirse rápidamente entre el cliente y el servidor, lo que es esencial para aplicaciones en tiempo real.
  • Facilidad de Uso: Socket.IO simplifica la implementación de la comunicación en tiempo real, lo que reduce la complejidad y el esfuerzo requeridos para crear aplicaciones en tiempo real. Además puedes elegir entre varias librerías que ya tienen las funciones necesarias para poder correr tu programa.

Desventajas:

  • Dependencia de una Biblioteca Externa: Utilizar Socket.IO implica depender de una biblioteca externa para la comunicación en tiempo real. Esto puede generar preocupaciones sobre la estabilidad y el mantenimiento de la biblioteca a largo plazo.
  • Posibles Problemas de Escalabilidad: Aunque Socket.IO es escalable y puede manejar un gran número de conexiones, su uso indebido o una configuración inadecuada pueden llevar a problemas de escalabilidad, especialmente en aplicaciones de alta concurrencia.

Conclusión: 

Uno como programador aprende que no siempre una tecnología es mejor, la realidad es que nuestro código se debe de adaptar a las necesidades, si quisiéramos implementar cualquiera de estos sockets solo tendríamos que ver cuál se ajusta mejor para el objetivo final y las necesidades que tengamos. Sin más espero que disfrutes del contenido de este blog..