Arquitectura WhatsApp
Buenas tardes, tengo algunas dudas sobre la forma en que un celular recibe mensajes; por ejemplo el caso de whatsapp:
Tengo entendido que los teléfonos celulares conectados a internet cuentan con una ip dinámica o estática (al igual que los ordenadores), sin embargo para telcel y fichas de pago (mi caso) la ip asignada es siempre dinámica.
Mi pregunta es, cómo logra la gente de whatsapp mandar un mensaje a un móvil en específico si tienen una ip dinámica ?
Investigué un poco y existe una técnica en j2me llamada PushRegistry que sirve justamente para eso, para enviar cosas a un móvil y despertarlo, sin embargo mi duda es cómo hace el servidor para identificarlo si no es a través de su número telefónico?
Pienso que tienen un esquema donde los datos enviados por el celular1 deben pasar por el servidor y el servidor es quien envía después los datos a Cel2:
[Cel1]------>[Server]------>[Cel2]
Mi pregunta es: Cómo logra Server enviar un mensaje sobre http (o tcp) a un número telefónico desde java?
Gracias de antemano por su atención
- Inicie sesión o regístrese para enviar comentarios
así es
Como dices, deben pasar por un servidor siempre. Nunca van directo de un celular a otro.
Lo del push es medio una ilusión, porque el que inicia la conexión siempre es el cliente (o sea, el celular). Si te mando un mensaje por whatsapp, mi cel se conecta al server, le envia el mensaje de mi parte a tu cuenta; el server guarda ese mensaje en una cola de salida. En cuanto tú te conectes, te llega mi mensaje. Los clientes (celulares) se conectan periódicamente para ver si hay mensajes pendientes.
El número telefónico sirve únicamente como ID único para cada cliente, porque la compañía telefónica es quien se encarga de que sea verdaderamente único.
Gracias
Gracias por la respuesta ezamudio, ahora me queda más claro :)
Peticiones periódicas
Una duda más
Eso quiere decir que si yo deseo hacer una aplicación similar a lo que hace whatsapp, debería estar haciendo peticiones periódicas desde el cliente (celular) en vez de que el servidor envíe los mensajes al cliente, esto no es ineficiente y generaría un tráfico de red muy alto? Pienso que para una conversación fluida, el cliente necesitaría hacer peticiones periódicas (por ejemplo cada 1seg)
No hay forma de que el servidor localice a un celular a través de su número telefónico y le mande datos?
Perdón por tantas preguntas pero me interesa este tema. Gracias nuevamente
no
No, no hay manera de que el servidor se conecte al cliente. El cliente es quien debe iniciar la comunicación. La razón es que el cliente por lo general estará detrás de firewalls o mínimo tendrá una IP local no accesible desde fuera (es lo que pasa con los celulares; el carrier tiene unas IP's públicas y detrás de ellas tiene a todos sus usuarios con IP's dinámicas).
Ahora, ¿por qué querrías iniciar una conexión cada segundo? Con que lo hicieras cada minuto sería suficiente, no? Pasarían pocos datos por la conexión si no hay mensajes pendientes... solamente el cliente se conecta, se autentica y espera unos segundos. Si hay mensajes pendientes, empiezan a llegarle al cliente; si no pues simplemente se queda esperando y luego de un rato cierra la conexión. Ese último "luego de un rato" hay que hacerlo también después de enviar un mensaje, por si la persona que lo recibe del otro lado contesta pronto, se pueda mantener una conversación activa sin tener que estarse reconectando. La cosa está en mantener abierta la conexión durante un lapso de tiempo razonable y poder utilizar un protocolo asíncrono para recibir mensajes que el servidor envíe en el momento que sea.
Entendido el tema !
Ok, muchas gracias por compartir su experiencia ezamudio. Agradezco mucho su apoyo y tiempo invertido en aclarar mis dudas, de verdad GRACIAS
Si haces que un telefono
Si haces que un telefono constantemente haga consultas al servidor, vas a hacer que se gaste la bateria muy rapido, necesitas saber como trabajan los servicios del dispositivo movil, y agregar tu programa a esos servicios.
Lo que comunmente hacen los programadores es crear un thread y que este thread haga las consultas, NUNCA HAGAS ESO, usa servicios.
Por ejmplo el Blackberry "recibe" mensajes a traves de push, pero haces que tu programa se de "de alta" en los servicios, y el bb, va a hacer lo demas.