2016-07-04 9 views
2

Ich versuche, eine Chat-App zu entwickeln, alles funktioniert gut, wenn das Internet stabil ist. So wie ich Nachrichten senden und empfangen kann. aber wenn das Internet für eine Weile ausgeht, schließt xmpp die Verbindung. Wenn das Internet zurückkommt, versuche ich mich wieder mit dem Server zu verbinden. Nach erfolgreicher Wiederherstellung habe ich den Stream Fehler von Client already logged in und Verbindung wird automatisch geschlossen.Wiederverbindung zu xmpp Server mit Smack

Hier ist mein Broadcast-Empfänger-Code, um die Internetverbindung zu überprüfen.

networkReceiver = new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      //super.onReceive(context, intent); 
      if(intent.getExtras()!=null) { 
       NetworkInfo ni=(NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO); 
       if(ni!=null && ni.getState()==NetworkInfo.State.CONNECTED) { 
        enableChat(); 
       } 
      } 
      else if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY,Boolean.FALSE)) { 
       disableChat(); 
      } 
      else{ 
       disableChat(); 
      } 
     } 

    }; 

Hier ist der Code zum Aktivieren des Chats und Deaktivieren des Chats.

public static void disableChat() { 

    msg_edittext.setClickable(false); 
    sendButton.setClickable(false); 
    form.setClickable(false); 

    msg_edittext.setEnabled(false); 
    sendButton.setEnabled(false); 
    form.setEnabled(false); 
    showNoInternetView(); 
    if (xmpp.getConnection()!=null) 
    xmpp.getConnection().disconnect(); 

} 

public static void showNoInternetView() { 
    linrNoInternet.setVisibility(View.VISIBLE); 
    msgListView.setVisibility(View.GONE); 
} 

public static void showInternetView() { 
    linrNoInternet.setVisibility(View.GONE); 
    msgListView.setVisibility(View.VISIBLE); 
} 
    public static void enableChat() { 
    msg_edittext.setClickable(true); 
    sendButton.setClickable(true); 
    form.setClickable(true); 

    showInternetView(); 

    msg_edittext.setEnabled(true); 
    sendButton.setEnabled(true); 
    form.setEnabled(true); 
    xmpp.connect("reconnect.."); 

} 

bei dem Versuch, das Fehlerprotokoll zeigt es ist wieder zu verbinden ..

07-04 10:25:52.880 8581-8612/com.vario.community D/xmpp: Authenticated! 
07-04 10:25:52.880 8581-9732/com.vario.community D/SMACK: SENT (0): <iq  id='BpGkK-5' type='get'><query xmlns='jabber:iq:roster'></query></iq> 
07-04 10:25:52.882 8581-8612/com.vario.community D/SMACK: XMPPConnection authenticated (0) 
07-04 10:25:52.882 8581-8612/com.vario.community I/LOGIN: Yey! We're connected to the Xmpp server! 
07-04 10:25:52.883 8581-8612/com.vario.community D/SMACK: XMPPConnection connected (0) 
07-04 10:25:52.883 8581-9732/com.vario.community D/SMACK: SENT (0): <presence id='BpGkK-6'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='E6FpoDPmjMQ3i53V+HWh0YBrS7U='/></presence> 
07-04 10:25:52.884 8581-9732/com.vario.community D/SMACK: SENT (0): <iq id='BpGkK-18' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'></bind></iq> 
07-04 10:25:52.885 8581-9732/com.vario.community D/SMACK: SENT (0): <r xmlns='urn:xmpp:sm:3'/> 
07-04 10:25:52.886 8581-9732/com.vario.community D/SMACK: SENT (0): <iq id='BpGkK-20' type='get'><query xmlns='jabber:iq:roster'></query></iq> 
07-04 10:25:52.886 8581-8612/com.vario.community E/(reconnect..): SMACKException: Client is already logged in 
07-04 10:25:52.888 8581-9732/com.vario.community D/SMACK: SENT (0): <presence id='BpGkK-21'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='JcQq0xyVq6PbVQSN9PSQq58gxiQ='/></presence> 
07-04 10:25:52.890 8581-8581/com.vario.community V/TextView: stopSelectionActionMode() 
07-04 10:25:52.893 8581-9732/com.vario.community D/SMACK: SENT (0): <presence id='BpGkK-22' type='unavailable'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='JcQq0xyVq6PbVQSN9PSQq58gxiQ='/></presence> 
07-04 10:25:52.893 8581-9732/com.vario.community D/SMACK: SENT (0): <a xmlns='urn:xmpp:sm:3' h='0'/> 
07-04 10:25:52.894 8581-9732/com.vario.community D/SMACK: SENT (0): </stream:stream> 

07-04 10:25:57.935 8581-9032/com.vario.community E/Roster: Exception reloading roster 
                 org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Used filter: IQReplyFilter: iqAndIdFilter (AndFilter: (OrFilter: (IQTypeFilter: type=error, IQTypeFilter: type=result), StanzaIdFilter: id=BpGkK-20)), : fromFilter (OrFilter: (FromMatchesFilter (full): null, FromMatchesFilter (bare): [email protected], FromMatchesFilter (full): vario.fitness)). 
                  at org.jivesoftware.smack.AbstractXMPPConnection$6.run(AbstractXMPPConnection.java:1443) 
                  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422) 
                  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
                  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
                  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                  at java.lang.Thread.run(Thread.java:818) 

Also, wenn jemand den Prozess der richtigen Wiederverbindung mir bitte helfen weiß. Ich habe nach dieser Frage gesucht, aber ich habe noch keine Lösung.

Dank :)

+0

Ich denke, es könnte Ihr xmpp Server Problem sein.In Ihrem Server sollte die Client-Verfügbarkeit mit Präsenz iq basierend auf einem Zeitintervall überprüfen.Wenn Client nicht beantwortet dann Server sollte den Client-Status in offline ändern.Wenn Client dazwischen verbunden ist Dieser Dauerserver sollte den Wiederverbindungsmechanismus zulassen. Überprüfen Sie die Serverdatenbank erneut. –

+0

Ich habe dich nicht bekommen. Sie sagen, dass sobald der Client die Verbindung schließt, der Server den Anwesenheitsstatus richtig ändern sollte? .. wenn das dann versuchte, versendete ich den Status nicht verfügbar, bevor ich die Verbindung getrennt habe, im Falle eines Internetfehlers. aber es gibt auch Fehler von Keine Antwort vom Server und nicht mit Server verbunden – Newbiee

+0

Plz überprüfen Sie eine Client-und Server-Seite dieses Problem dann nur es könnte aufgelöst werden.Für Beispiel Server sollte immer die Client-Verfügbarkeit mit Presence-Zeilengruppe basierend auf dem Server überprüfen Request-Client sollte die Antwort an den Server dann nur Server sollte Client-Login-Session-Status zu verwalten.Wenn einige Clients nicht reagieren die Server-Ping dann Server automatisch schließen diese Client-Login-Sitzung .Das ist die Hauptschönheit von Xmpp Server dann nur die meisten der Chat Apps, die dieses xmpp-Protokoll verwenden. –

Antwort

1

Das ist ein bekannter Fehler in Smack ist: SMACK-725.

Beachten Sie, dass ich die Verwendung von ReconnectionManager unter Android nicht empfehle. Stattdessen schlage ich vor, Ihre eigene Reconnection-Logik für eine mobile Umgebung zu implementieren und die von Android bereitgestellten Informationen zu nutzen (z. B. die CONNECTIVITY_CHANGED-Intention abhören).

+0

danke, ich werde es mir ansehen. aber was ist die Alternative? Wie sollte ich dann wieder verbinden? – Newbiee

+0

Aktualisieren Sie meine Antwort – Flow

+0

Danke für den Kommentar, ich werde versuchen, eine Alternative zu implementieren. – Newbiee

Verwandte Themen