2012-05-31 14 views
10

Ho riscontrato un comportamento piuttosto strano utilizzando smack per creare un piccolo client/bot XMPP. Ho impostato la connessione e un ConnectionListener e un ChatManagerListener. Funziona abbastanza bene e posso quindi chattare con la mia applicazione che è in esecuzione su un dispositivo portatile.Smack Client - L'utente è ancora "online" sebbene la connessione sia stata interrotta

Per verificare il comportamento in caso di connessione persa, ho collegato il cavo Ethernet del dispositivo portatile. Mi aspettavo che il client XMPP perdesse la connessione e che l'utente fosse impostato "offline" nel roster degli utenti utenti. Quello che succede è che questo utente è ancora mostrato come 'online' e ConnectionListener del mio client non fa fuoco, se connectionConnected o reconectionFailed o altro.

Quando ricollego il cavo Ethernet, a volte è come se la connessione fosse sempre attiva. I messaggi offline sono gestiti e posso chattare di nuovo come prima. Altre volte il mio cliente è totalmente inaccessibile e fuori uso, sembra che tutti gli ascoltatori se ne siano andati ... Ma non vengono lanciate esecuzioni.

Questo è un comportamento piuttosto strano e incontrollabile che renderebbe l'intero client inutilizzabile per me, poiché non posso essere sicuro che il client verrà visualizzato nuovamente dopo che la connessione è stata distorta.

Qualcun altro ha avuto problemi o ha qualche indizio su cosa sta succedendo?

Se necessario, posso fornire il mio codice, ma in realtà è sufficiente copiare la copia & dalla documentazione di Smack.

risposta

8

Si sta attualmente descrivendo due effetti diversi qui. Iniziamo con quello che viene chiamato nel titolo della tua domanda: L'utente è assunto online dal server anche se la connessione è bruscamente, e quindi impura, interrotta. Il motivo è semplicemente che il server non ha ancora notato la disconnessione del client, in quanto non vi era una terminazione pulita del flusso della stanza XMPP. La maggior parte dei server XMPP controlla i client con un ping ogni X minuti. Se un client non risponde si presume disconnesso e mostrato offline (se era l'ultima risorsa connessa per quel JID). Questo non è successo qui e non è raro. Perché a volte vuoi avere lunghi timeout (mezz'ora o più).

Lo stesso vale per l'altro lato. Smack invia anche ping XMPP ogni X minuti se viene utilizzato PingManager o PingManagerWithAlarmManager (per Android). Se c'è un problema con il socket usato, viene generata un'eccezione.

Spero di poterti indirizzare nella giusta direzione. Devi eseguire il debug di te stesso perché la connessione non è terminata con un'eccezione nel tuo caso.

Un'ultima cosa: una connessione TCP può facilmente sopravvivere a un timeout anche se il cavo Ethernet viene scollegato e quindi riavviato. Esistono molti timeout su vari livelli del modello OSI coinvolti: NAT, TCP, XMPP, ecc.

+0

Grazie per i chiarimenti, potrebbero aiutarmi. Forse sarò più paziente e aspetterò più di 1-2 minuti prima di ricollegare il cavo. In ogni caso il problema degli ascoltatori a volte rimanendo sintonizzati e talvolta non è ancora un mistero. Ma penso che aprirò un'altra domanda per questo. – signpainter

+2

Vorrei aggiungere che questo comportamento di TCP non è un bug, ma una grande funzionalità che poche persone sembrano apprezzare.Non è necessario riconnettersi e eseguire l'installazione del flusso XMPP piuttosto costosa consente di risparmiare un sacco di roundtrip. Ciò che si desidera è che il sistema operativo informi della perdita e della ripresa della connettività, in modo che sia possibile verificare se la connessione è sopravvissuta. Se così fosse, corri come se nulla fosse accaduto, altrimenti ricollegalo. Anche la riconnessione XEP-0198 è fantastica. – Zash

0

potrete usufruire anche in modo esplicito il metodo disconnect() di interrompere la connessione, altrimenti il ​​server dovrà ping periodicamente e rendersi conto che sono andati offline

Problemi correlati