2016-07-28 21 views
2

Ich arbeite mit der XMPPTCPConnection, um mit meinem openfire-Server zu verbinden, erfolgreich verbunden und erfolgreich gesendet/empfangen Datenpakete. Die Verbindung bleibt stabil, fällt aber plötzlich mit einer Ausnahme ab und ich habe keine Ahnung von dieser Ausnahme. Die Zeit für den Server-Verbindungsabbau im Leerlauf beträgt 60 Sekunden. Und ich habe alle Ping-Manager implementiert und Code erneut zu verbinden. Also seine Wiederverbindung, aber nicht bekommen, warum es Verbindung mit Ausnahme oder wie diese Ausnahme zu lösen.xmpp mit Openfire-Client-Verbindung verloren plötzlich mit smack 4.1

E/MainService: Connection to XMPP server was lost.org.jivesoftware.smack.SmackException: Parser got END_DOCUMENT event. This could happen e.g. if the server closed the connection without sending a closing stream element 
07-28 10:21:22.003 12719-16068/com.thatsit.android D/SMACK: 
XMPPConnection closed due to an exception (0) 
07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err: org.jivesoftware.smack.SmackException: Parser got END_DOCUMENT event. This could happen e.g. if the server closed the connection without sending a closing stream element 

07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err:  at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:1170) 

07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err:  at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:952) 
07-28 10:21:22.003 12719-16068/com.thatsit.android W/System.err:  at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:967) 
07-28 10:21:22.013 12719-16068/com.thatsit.android W/System.err:  at java.lang.Thread.run(Thread.java:818) 

Jede Hilfe wird sehr zu schätzen wissen.

Antwort

0

es gibt keine Notwendigkeit, ideale Benutzer zu trennen.

Wenn Sie wieder trennen dann einen Dienst, der im Hintergrund arbeitet und überprüfen Sie die Xmpp-Verbindung alle 10 Sekunden. Wenn verbunden dann gibt es keine Notwendigkeit, eine Verbindung herzustellen, aber trennen Sie dann wieder mit dem Server verbinden. Ich habe das von meiner App aus gehandhabt.

Ich habe auch Quellcode auf github öffnen. Wenn Sie wollen, dann können Sie von dort beziehen.

Dies ist nicht Code mit 4.1 aktualisiert, aber ich habe bereits Änderungen vorgenommen, müssen aber hochladen. Heute Abend werde ich den aktualisierten Code hochladen.

Danke, hoffe, dass dies hilft, Ihr Problem zu lösen.

0

Tatsächlich gibt es zwei Probleme in Bezug auf Ihre: eine ist in Openfire 4.x.x und eine ist in der Smack 4.0.7-Bibliothek.

Es gibt einen Fehler (OF-1308) in Openfire 4.x.x und höher, dass der End-Tag des Streams nicht als absichtliche Trennung an den Client gesendet wird, wenn der Server einen Client trennt. Es schließt nur den Socket und bewirkt, dass PacketReader das Ereignis END_DOC erhält. Der PacketReader verarbeitet in Smack IOException (unerwarteter Verlust der Netzwerkverbindung), Endtag des Streams (eine absichtliche Trennung) oder END_DOC (unerwartete Trennung vom Server wie Server abgestürzt.) Wenn IOException ausgelöst wird, wird Reconnection Manager ausgelöst aktiviert. Wenn Sie ein End-Tag des Streams erhalten, wird ein normales Ereignis zum Schließen der Verbindung ausgelöst. Smack behandelt jedoch das END_DOC als End-Tag des Streams. Meiner Meinung nach sollte Smack END_DOC als IOException behandeln, da das End-Tag des Streams nicht empfangen wurde.

Es gibt eine andere Wendung. Wenn Sie die Komprimierung aktiviert haben, erhält PacketReader IOException, wenn der Server den Socket einfach schließt. Wenn die Komprimierung deaktiviert ist, erhält PacketReader END_DOC, wenn der Server den Socket einfach schließt.

Wenn in Ihrem Fall ein Leerlaufzeitlimit aktiviert ist, sollte der Client den ReconnectionManager nicht auslösen. Andernfalls wird der Zweck der Leerlaufzeitüberschreitung nicht erreicht. Ich teste meine Fehlerbehebung, daher habe ich den Smack-Fehler noch nicht an die Ignite-Community gemeldet.