Mensajes perdidos sobre XMPP en el dispositivo desconectado

Estoy tratando de desarrollar un juego base por turnos en XMPP. (La única solución que encontré para el juego multiplataforma). Puedo enviar mensajes sin problemas. Si el otro usuario no está en línea, el servidor (OpenFire) lo guardará para su posterior entrega.

El problema se produce cuando un dispositivo cambia la red (cambia de 3g a WiFi, cambia 3g IP …) o el dispositivo pierde la red (apague 3g, wifi o conexión perdida). El servidor piensa que el dispositivo está en línea y envía el mensaje pero nunca obtiene (obviusly), por lo que se pierde el paquete.

Conozco una solución. Implementar ACK sobre mi protocolo de juego, pero no me gusta mucho esta idea. ¿Tienes alguna otra sugerencia? Creo que esto es un problema de servidor. ¿Conoces otro servidor que implementa TCP o ACK?

¡¡Gracias!!

EDIT: Hago eso: Conecte el dispositivo al servidor. Apago la conectividad 3G y WiFi al dispositivo. Android y el servidor sigue pensando que la conexión está viva.

Http://issues.igniterealtime.org/browse/SMACK-331

PD: Pido a openfeint para que api multijugador, pero no me asnwer …

Aunque BOSH probablemente funcionará en este caso, otra opción es XEP-0198 : Gestión de flujo. Esto le permitirá tener todo el rendimiento de un zócalo totalmente conectado, junto con reconecciones rápidas, acking positivo y cola mientras no está conectado o desconectado en ambas direcciones.

Bajo algunas condiciones TCP / IP no es confiable. Esta es la razón por la cual ACKs, recibos de mensaje, IQ u otras extensiones en XMPP pueden resolver este problema.

He hecho un montón de programación móvil a lo largo de los años, también a menudo con Openfire. Pero no he visto mensajes perdidos. Asumo que hay un problema en la biblioteca que está utilizando en Android o en la versión de Openfire que utilice.

En lugar de usar sockets sin procesar, también puede utilizar BOSH:
http://xmpp.org/extensions/xep-0124.html
BOSH se basa en WebRequests como Comet y funciona muy bien en entornos donde cambia o suelta a menudo la conexión. Puede mantener la conexión viva hasta que su red esté de nuevo y no da lugar a gotas de la conexión cuando una o más peticiones fallan en una fila.

Yo también me encontré con este problema y he estado tratando de encontrar una manera adecuada de conseguir esto resuelto.

El problema para mí es que establezco la política de mensajes fuera de línea en "Siempre almacenar" y por lo tanto XEP-0184 realmente no ayuda a determinar si un mensaje no se está entregando a su receptor.

Proporcionando este escenario: – Tengo 2 usuarios charlando, los llamo A y B – A envía un mensaje B mientras la conexión de B se acaba de perder – El mensaje se cayó y A no se notifica – En este caso A no sabe que el mensaje se Se supone que el mensaje se entrega al servidor, el servidor finalmente lo entregará a B – B perderá el mensaje para siempre

Así que temporalmente poner en un trabajo alrededor de esto … i almacenar todos los mensajes que no se entregan (es decir, no han recibido el recibo de entrega de mensajes) en una cola, luego periódicamente (por ejemplo, 6 minutos – es el momento en que los Las conexiones muertas se borraron) comprueba cada mensaje de la cola para ver si el destinatario previsto es "En línea" Y el recibo todavía no recibido … Si es el caso, entonces marca ese mensaje como "entrega fallida"

Esta es una manera terrible de arreglarlo (por favor avise si tiene una mejor manera de hacerlo). Creo que lo mejor es que el servidor haga lo siguiente: si el mensaje no se entregó y la política de mensajes fuera de línea es "Siempre almacenar", lo almacenamos en "ofoffline" para retrasar la entrega.

Esta es una vieja, pero yo estaba resolviendo tal problema recientemente. Me ayudó cuando establecí el recurso XMPP (la última parte de JID completo) a algo razonable, al construir la conexión. De lo contrario, se generará de forma aleatoria en cada reconectar – y eso cambiará el JID completo.

  • ¿Cómo implementar el estado de lectura de mensajes como whatsapp blue tick mark?
  • Durante la transferencia de archivos usando smack en android: java.util.concurrent.ExecutionException: no hay respuesta del cliente
  • Cómo obtener el valor de atributo personalizado de un mensaje XMPP XML?
  • Límite de mensajería en la nube de Google
  • GCM: cómo evitar el estrangulamiento
  • agregar / sincronizar contactos automáticamente
  • La mejor manera de crear un cliente de chat Android XMPP en Unity3D
  • Cómo saber Escribir Estado en XMPP openfire usando Smack
  • Android File Transfer no funciona a través de XMPP y OpenFire
  • Envío y recepción de mensajes con Smack Api para Android
  • ¿No puede obtener la lista de salas públicas de xmpp Server en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.