Mensajes XMPP perdidos en Android mientras cambia la conectividad de datos (por ejemplo, activando Wifi de, GSM <-> Wifi)
Estoy desarrollando una aplicación de chat en android. Uso del servidor XMPP. El servidor PHP se ha migrado a ejabber.
Mi notificación funciona correctamente en todos los escenarios. Pero en un caso estoy perdiendo los mensajes XMPP. De hecho no estoy recibiendo notificaciones.
- GetSearchForm devuelve null cuando se utiliza UserSearch en XMPP con aSmack
- Cómo obtener DiscussionHistory para MultiUserChat habitación usando aSmack?
- Cómo implementar XMPP para enviar notificaciones push
- Android y XMPP: Soluciones disponibles actualmente
- Android - Smack presencia y "está escribiendo" características que no funcionan
En detalle, estoy apagando la conexión WiFi o de datos. y después de apagar WiFi o conexión de datos cualquier notificación enviada a mí que no está recibiendo. después de que cuando ENCIENDO el WiFi o la conexión de datos, no puedo conseguir los mensajes que fueron enviados a mí.
He implementado el servicio en segundo plano. que hace que la conexión xmpp siempre esté activa.
Consigo este error mientras que apago la conexión de WiFi.
java.net.SocketException: sendto failed: EPIPE (Broken pipe) java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506) at libcore.io.IoBridge.sendto(IoBridge.java:475) at java.net.PlainSocketImpl.write(PlainSocketImpl.java:508) at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46) at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:270) at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167) at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158) at java.io.BufferedWriter.flush(BufferedWriter.java:124) at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:286) at org.jivesoftware.smack.PacketWriter.access$12(PacketWriter.java:270) at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:137) Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe) at libcore.io.Posix.sendtoBytes(Native Method) at libcore.io.Posix.sendto(Posix.java:146) at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177) at libcore.io.IoBridge.sendto(IoBridge.java:473) ... 9 more at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:552) at libcore.io.IoBridge.recvfrom(IoBridge.java:516) at java.net.PlainSocketImpl.read(PlainSocketImpl.java:489) at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:241) at java.io.InputStreamReader.read(InputStreamReader.java:244) at java.io.BufferedReader.read(BufferedReader.java:310) at org.jivesoftware.smack.XMPPConnection$AliveReader.read(XMPPConnection.java:1122) at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1496) at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:979) at org.kxml2.io.KXmlParser.next(KXmlParser.java:346) at org.kxml2.io.KXmlParser.next(KXmlParser.java:310) at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:321) at org.jivesoftware.smack.PacketReader.access$1(PacketReader.java:216) at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:70) Caused by: libcore.io.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out) at libcore.io.Posix.recvfromBytes(Native Method) at libcore.io.Posix.recvfrom(Posix.java:131) at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:164) at libcore.io.IoBridge.recvfrom(IoBridge.java:513) ... 13 more
- Transferencia de archivos android con smack
- Xmpp + openfire + confirmación del servidor al remitente
- ¿Cómo implementar el estado de lectura de mensajes como whatsapp blue tick mark?
- Mantener la conexión XMPP (utilizando asmack) en vivo en Android
- Smack 4.1 No hay respuesta dentro del tiempo de espera de respuesta
- Incorporación del protocolo XMPP a una aplicación de Android
- Obtener usuarios en línea (entradas de la lista) usando smack 4.1 en android
- Autenticar a Google Talk (XMPP, Smack) mediante un authToken
Así que para instalar mod_archive necesito hacer esto, el típico: Escribe la siguiente línea en cmd. (Por centésimo Os)
Iniciar sesión como root Crear un nuevo directorio:
mkdir ejabberd_archive_plugin cd ejabberd_archive_plugin
ahora obtenga los últimos módulos de ejabberd usando el comando siguiente
yum https://svn.process-one.net/ejabberd-modules cd ejabberd-modules/mod_archive/trunk ./build.sh
Ahora vaya al directorio ebin usando el siguiente cmd y obtenga la lista de todos los archivos * .beam para los complementos de archivo ejabberd.
root@ns1 [/ejabberd_archive_plugin/ejabberd-modules/mod_archive/trunk/ebin]# ls –l
Utilizando el siguiente comando cmd obtendrá toda la lista de ejabberd * .beam cuando ejabberd configure y configure.
root@ns1 [/usr/lib64/ejabberd/ebin]# ls -l
Ahora copie todos los archivos * .beam (archivos de complementos) al directorio ebbin ebberd usando el siguiente cmd
root@ns1 [/]# cp /ejabberd_archive_plugin/ejabberd-modules/mod_archive/trunk/ebin /usr/lib64/ejabberd/ebin
Ahora vaya a la siguiente URL y copie todas las consultas de tablas de sql y ejecute en phpmyadmin (base de datos ejabberd)
https://svn.process-one.net/ejabberd-modules/mod_archive/trunk/src/mod_archive_odbc_mysql.sql
Ahora configure ejjaberd.cfg usando el siguiente cmd
root@ns1 [/etc/ejabberd]# vi ejabberd.cfg Add the following line into ejabberd.cfg file in modules configuration section {mod_archive_odbc, [{database_type, "mysql"}, {default_auto_save, true}, {enforce_default_auto_save, true}]},
Ahora reinicie el servicio ejabberd.
root@ns1 [/etc/ejabberd]# sudo service ejabberd restart
Usted necesita "Gestión de Flujo" XEP-198 permitió conexiones para lograr esto. Georg escribió una buena entrada de blog sobre el tema: http://op-co.de/blog/posts/XEP-0198/ Básicamente, permite el reconocimiento de stanza y la reanudación de secuencia , que es exaclty lo que quieres hacer en caso de, por ejemplo un conmutador Wifi <-> GSM.
Concluyo de la stacktrace que usted está usando aSmack (que es Smack portado a Android). Existe una solicitud de característica abierta para implementar la Gestión de flujo en Smack: SMACK-333 . De hecho, recientemente he empezado a trabajar en la implementación, pero no puedo nombrar un ETA.
Tienes que crear el servicio web independiente para eso. por lo tanto, por qué podemos manejar la historia del mensaje enviado. podemos administrar el mensaje fuera de línea.
XEP-198 es la única solución. hacer plugin para su servidor y hacer que sea fácil de administrar el mensaje que permanece que se pierde. puede haber otra solución, pero AFAIK, esta sería la solución.
puede modificar el complemento de archivo para guardar los identificadores de mensaje en él.
Cuando el usuario viene en línea, llame a un servicio web con el último mensaje recibido. servidor puede obtener todos los mensajes posteriores guardados en el servidor. Lo creé de la misma manera y funcionaba perfectamente bien.
Usted debe relogin después de volver a conectar a la Internet cada vez. Pero, tenga en cuenta que si vuelve a conectar con el mismo recurso y el mismo usuario, incluso está en línea, entonces el servidor arrojará error de flujo (reemplazado por una nueva conexión) que lo hará fuera de línea y no recibirá ningún mensaje. Para ello, desconéctelo correctamente antes de volver a conectarlo. Intente buscar en el modulo Amp .
- Tamaños de captura de pantalla para publicar la aplicación android en Google Play
- No encontré la clase en la ruta: dexpathlist