2012-05-31 14 views
10

Ich erlebe ein ziemlich seltsames Verhalten mit Smack, um einen kleinen XMPP Client/Bot zu bauen. Ich habe die Verbindung sowie einen ConnectionListener und einen ChatManagerListener eingerichtet. Das funktioniert ganz gut und ich kann dann mit meiner Anwendung chatten, die auf einem tragbaren Gerät läuft.Smack Client - Benutzer ist immer noch "online" obwohl Verbindung abgebrochen

Um das Verhalten bei verlorener Verbindung zu testen, steckte ich das Ethernet-Kabel des tragbaren Geräts aus. Ich erwartete, dass der XMPP-Client die Verbindung verliert und dass der Benutzer in der Liste der Benutzer-Buddys "offline" gesetzt wird. Was passiert, ist, dass dieser Benutzer immer noch als 'online' angezeigt wird und der ConnectionListener meines Clients nichts auslöst, egal ob connectClosed oder reconnectionFailed oder anders.

Wenn ich dann das Ethernetkabel wieder einstecke, ist es manchmal so, als wäre die Verbindung die ganze Zeit über am Leben. Die Offline-Nachrichten werden behandelt und ich kann wieder wie zuvor chatten. Andere Zeiten mein Client ist völlig unzugänglich und außer Betrieb, scheint wie alle Zuhörer weg sind ... Aber keine Ausnahmen werden geworfen.

Das ist ein ziemlich merkwürdiges und unkontrollierbares Verhalten, das den ganzen Client für mich unbrauchbar machen würde, da ich nicht sicher sein kann, dass der Client wieder auftaucht, nachdem die Verbindung unterbrochen wurde.

Hat jemand andere solche Probleme oder Hinweise, was (nicht) passiert?

Bei Bedarf kann ich meinen Code zur Verfügung stellen, aber es ist eigentlich nur kopieren & Paste aus der Smack-Dokumentation.

Antwort

8

Sie beschreiben zwei verschiedene Effekte hier. Beginnen wir mit dem, der im Titel Ihrer Frage genannt wird: Der Benutzer wird online vom Server angenommen, auch wenn die Verbindung abrupt, und daher unsauber, abgebrochen wird. Der Grund ist einfach, dass der Server die Trennung des Clients noch nicht bemerkt hat, da es keine saubere Beendigung des XMPP-Zeilengruppenstroms gab. Die meisten XMPP-Server überprüfen die Clients alle X Minuten mit einem Ping. Wenn ein Client nicht antwortet, wird angenommen, dass die Verbindung unterbrochen und offline angezeigt wird (wenn es sich um die letzte verbundene Ressource für diese JID handelt). Das ist hier nicht passiert und ist nicht ungewöhnlich. Manchmal möchten Sie lange Timeouts haben (eine halbe Stunde oder länger).

Das Gleiche gilt für die andere Seite. Smack sendet auch XMPP-Pings alle X Minuten, wenn PingManager oder PingManagerWithAlarmManager (für Android) verwendet wird. Wenn ein Problem mit dem verwendeten Socket auftritt, wird eine Ausnahme ausgelöst.

Ich hoffe, dass ich Ihnen in die richtige Richtung zeigen konnte. Sie müssen selbst debuggen, warum die Verbindung in Ihrem Fall nicht mit einer Ausnahme beendet wird.

Eine letzte Sache: Eine TCP-Verbindung kann leicht einige Timeouts überstehen, selbst wenn das Ethernet-Kabel aus- und wieder eingesteckt wird. Es gibt viele Timeouts auf verschiedenen Schichten des OSI-Modells: NAT, TCP, XMPP usw.

+0

Danke für die Klarstellung gegangen sind, könnten sie mir helfen. Vielleicht werde ich geduldiger und warte mehr als 1-2 Minuten bevor ich das Kabel wieder einstecke. Jedenfalls ist das Problem, dass die Zuhörer manchmal dran bleiben und manchmal nicht, immer noch ein Geheimnis. Aber ich denke, ich werde dafür eine andere Frage aufwerfen. – signpainter

+2

Ich möchte hinzufügen, dass dieses Verhalten von TCP kein Fehler ist, sondern ein großartiges Feature, das nur wenige Menschen zu schätzen wissen.Nicht um die recht teuer XMPP-Stream-Setup viel Rundreisen erspart Ihnen zu verbinden und zu tun. Was Sie wahrscheinlich wollen, ist für die OS Sie über den Verlust zu sagen, und die Wiederaufnahme, der Konnektivität, so dass Sie dann überprüfen, ob die Verbindung überlebt. Wenn ja, laufen entlang, als wäre nichts geschehen, sonst wieder an. XEP-0198 Reconnection ist auch super. – Zash

0

Sie haben auch explizit die disconnect() Methode verwenden, um Ihre Verbindung zu beenden, da sonst der Server werden Sie regelmäßig ping müssen und erkennen Sie offline