Hola a todos! Como supongo que muchos os estáis adentrando en el mundo de los websockets por primera vez aquí va una ayuda que en el futuro agradeceréis:
La tecnología de websockets (un canal full-duplex entre el cliente y el servidor) tiene dos formas de implementarse dentro de la librería socket.io :
- Usando polling: Consiste en hacer sucesivas peticiones HTTP(S) desde el cliente al servidor para dar “la sensación” de tener un canal full duplex pero en realidad son muchas peticiones HTTP.
- Usando el protocolo websockets que con el tiempo ya ha sido estandarizado como para ser usando en producción sin preocuparse. En este protocolo ya los websockets son de verdad, no hay peticiones HTTP para mantener viva la conexión e incluso poder enviar un mensaje desde el servidor al cliente siendo el servidor el emisor original del mensaje y no el que responde a una petición.
Bueno ahora que ya tenemos claros estos conceptos aquí os presento un gran problema que tendréis con la librería de Socket.io. Esta librería viene a ser como el jQuery de los websockets. Antes cuando había que hacer checks para ver si el navegador era compatible con protocolo websockets era útil ya que de no ser así internamente Socket.io usaría el protocolo de polling.
Y tu dirás… eso esta cool. ¿Dónde esta el problema? El problema esta en la dificultad para configurar correctamente Socket.io cuando lo estas integrando con un proyecto React Native.
Después de pasar días configurando Socket.io para que usara el protocolo websockets (el que debe ser usado en React Native para aplicaciones móviles) y comprobando desde lo navegadores que funcionaba correctamente y ver que en movil no funcionaba llego a la siguiente conclusión.
En Android hay problemas para usar websockets con Socket.io ya que si se escoge el protocolo polling internamente Socket.io usará setTimeout/setInterval para establecer el intervalo de peticiones y Android empieza a escupir Warnings como un campeón. Para esto hay una libreria llamada socket.io-cliente que es una version standalone (portable) del cliente de socket.io pero me ha sido imposible implementarlo correctamente y que me funcionara bien entre servidores-navegadores-ios-android.
En cuanto he usado la libreria nátiva de websockets (ws) todo ha ido de maravillas y ni navegador ni móviles han dado ni un solo problema.
Usa la librería nativa de websockets si no necesitas al 100% usar Socket.io
Y si no tener gestión de eventos te preocupa, despreocúpate ya! Aquí tienes una librería que he hecho para gestionar los eventos desde websockets nativos.
https://github.com/icastillejogomez/ws-events
¿No es genial?
Los aportes, preguntas y respuestas son vitales para aprender en comunidad. Regístrate o inicia sesión para participar.