2016-07-04 3 views
2

채팅 앱을 개발하려고하는데 인터넷이 안정되면 모든 것이 잘 작동합니다. 나는 메시지를 보내고받을 수 있습니다. 하지만 인터넷이 잠시 꺼지면 xmpp는 연결을 닫습니다. 인터넷이 다시 서버에 다시 연결하려고 할 때 돌아옵니다. 연결이 성공한 후 나는 Client already logged in의 스트림 오류를 가지며 연결은 자동으로 닫힙니다.smack을 사용하여 xmpp 서버에 다시 연결

다음은 인터넷 연결을 확인하는 방송 수신자 코드입니다.

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(); 
      } 
     } 

    }; 

여기에 채팅을 사용하거나 사용하지 않도록 설정하는 코드가 있습니다.

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.."); 

} 

누군가가 적절한 재 연결의 과정을 알고 있다면
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) 

그래서, 저를 도와주세요 .. 오류가 그것을 보여줍니다 로그 다시 연결하는 동안. 나는이 질문을 찾았지만 아직 해결책을 얻지 못했다.

감사합니다 :)

+0

나는 당신의 xmpp 서버 문제일지도 모른다. 당신의 서버는 약간의 시간 간격에 따라 존재하는 iq를 사용하여 클라이언트 가용성을 점검해야한다. 클라이언트가 응답하지 않으면 서버가 클라이언트 상태를 오프라인으로 변경해야한다. 클라이언트가 중간에 연결되면 해당 기간 서버가 재 연결 메커니즘을 허용해야합니다. 서버 데이터베이스를 다시 한 번 확인하십시오. –

+0

나는 당신을 얻지 못했습니다. 당신은 일단 클라이언트가 연결을 닫으면, 서버가 현재 상태를 바꿔야한다고 말하고 있습니까? .. 그렇다면 인터넷 장애시 연결 해제 전에 상태를 사용할 수 없게 보냈습니다. 하지만 그것은 나에게 서버에서 응답 없음의 오류를 제공하고 서버 – Newbiee

+0

에 연결되어 있지 않습니다 Plz는 클라이언트와 서버 측 모두에서이 문제를 확인한 다음 해결할 수 있습니다. 예를 들어 서버는 항상 서버 기반의 현재 상태 스탠자를 사용하여 클라이언트 가용성을 확인해야합니다 요청 클라이언트는 서버에 대한 응답을 보내야 만 서버가 클라이언트 로그인 세션 상태를 유지해야합니다. 일부 클라이언트가 서버에 응답하지 않으면 서버가 자동으로 클라이언트 로그인 세션을 닫습니다. 이렇게하면 xmpp 서버의 주된 아름다움이 대부분의 채팅에 포함됩니다 이 xmpp 프로토콜을 사용하는 앱 –

답변

1

헤로인에서 알려진 버그 : SMACK-725.

Android에서 ReconnectionManager를 사용하지 않는 것이 좋습니다. 대신 모바일 환경을 위해 꼬리표를 달고 Android에서 제공하는 정보 (예 : CONNECTIVITY_CHANGED 인 텐트를 수신)를 활용하여 나만의 재 연결 논리를 구현하는 것이 좋습니다.

+0

감사합니다. 나는 그것을 살펴볼 것입니다. 하지만 대체 뭐야? 어떻게 다시 연결해야합니까? – Newbiee

+0

내 대답 업데이트 – Flow

+0

의견을 주셔서 감사합니다, 나는 대안을 구현하려고합니다. – Newbiee

관련 문제