2015-02-19 5 views
0

Я работаю над чат-приложением, используя asmack. Я могу установить соединение xmpp и правильно отправлять и получать сообщения. Однако я хочу повторно подключить XMPP-соединение, если я изменю подключение к Интернету с WIFI на #G и наоборот. Чтобы прослушать изменение подключения, у меня есть широковещательный приемник, который успешно уведомляет о соединении. Если я свяжусь как false, я проверю соединение xmpp для null или не null. Если это не null, я устанавливаю его как null. И когда интернет подключен, я пытаюсь восстановить соединение xmpp. Главное, что я запускаю свое приложение в первый раз, соединение xmpp успешно завершено, и квитирование TLS выполняется правильно. Я уточнял логику доверенной следующим образом:Невозможно повторно подключить XMPP при подключении к Интернету

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
    { 
     connectionConfig.setTruststoreType("AndroidCAStore"); 
     connectionConfig.setTruststorePassword(null); 
     connectionConfig.setTruststorePath(null); 
    } 
    else 
    { 
     connectionConfig.setTruststoreType("BKS"); 
     String path = System.getProperty("javax.net.ssl.trustStore"); 
     if(path == null) 
     { 
      path = System.getProperty("java.home") + File.separator + "etc" + File.separator + "security" + File.separator + "cacerts.bks"; 
     } 
     connectionConfig.setTruststorePath(path); 
    } 

Это прекрасно работает в первый раз, и рукопожатие TLS дает мне ниже результата в LogCat:

Но когда я пытаюсь восстановить, как описано выше, я не получаю тег успеха, который был получен ранее. Вместо того, чтобы ошибки, полученные следующим образом:

02-19 17:59:39.098: W/System.err(21977): java.net.SocketException: Socket closed 
02-19 17:59:39.133: W/System.err(21977): at libcore.io.Posix.sendtoBytes(Native Method) 
02-19 17:59:39.133: W/System.err(21977): at libcore.io.Posix.sendto(Posix.java:146) 
02-19 17:59:39.137: W/System.err(21977): XMPPError establishing connection with server.: remote-server-error(502) XMPPError establishing connection with server. 
02-19 17:59:39.141: W/System.err(21977): -- caused by: javax.net.ssl.SSLException: Unable to create application data 
02-19 17:59:39.160: W/System.err(21977): at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177) 
02-19 17:59:39.160: W/System.err(21977): at libcore.io.IoBridge.sendto(IoBridge.java:473) 
02-19 17:59:39.160: W/System.err(21977): at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507) 
02-19 17:59:39.160: W/System.err(21977): at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46) 
02-19 17:59:39.160: W/System.err(21977): at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269) 
02-19 17:59:39.160: W/System.err(21977): at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167) 
02-19 17:59:39.160: W/System.err(21977): at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158) 
02-19 17:59:39.160: W/System.err(21977): at java.io.BufferedWriter.flush(BufferedWriter.java:124) 
02-19 17:59:39.160: W/System.err(21977): at org.jivesoftware.smack.util.ObservableWriter.flush(ObservableWriter.java:48) 
02-19 17:59:39.160: W/System.err(21977): at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:196) 
02-19 17:59:39.160: W/System.err(21977): at org.jivesoftware.smack.PacketWriter.access$000(PacketWriter.java:40) 
02-19 17:59:39.160: W/System.err(21977): at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:76) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.XMPPConnection.initReaderAndWriter(XMPPConnection.java:699) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:835) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:262) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:43) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:69) 
02-19 17:59:39.164: W/System.err(21977): Nested Exception: 
02-19 17:59:39.164: W/System.err(21977): javax.net.ssl.SSLException: Unable to create application data 
02-19 17:59:39.164: W/System.err(21977): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_do_handshake(Native Method) 
02-19 17:59:39.164: W/System.err(21977): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:395) 
02-19 17:59:39.164: W/System.err(21977): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.<init>(OpenSSLSocketImpl.java:647) 
02-19 17:59:39.164: W/System.err(21977): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.getInputStream(OpenSSLSocketImpl.java:618) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.XMPPConnection.initReaderAndWriter(XMPPConnection.java:666) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.XMPPConnection.proceedTLSReceived(XMPPConnection.java:835) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:262) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:43) 
02-19 17:59:39.164: W/System.err(21977): at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:69) 

Пожалуйста, помогите мне восстановить неудавшуюся связь XMPP, а также дайте мне знать, если есть способ получить идентификатор сеанса, так что я могу проверить с сервером ли любой XMPP соединение сохраняется в отношении запрошенного идентификатора сеанса.

+0

вы используете aSmack? – Carnal

+0

Проверьте эту ссылку: http://stackoverflow.com/questions/13080535/how-to-keep-a-xmpp-connection-stable-on-android-with-asmack – Carnal

+0

Да, я использую библиотеку asmack. Я упомянул об этом и в своем описании. –

ответ

0

Я решил эту проблему, и я нашел решение. Решение выглядит следующим образом:

1) Во-первых, я изменил логику, как доверенное хранилище дано мне в моем вопросе к следующему

connectionConfig.setTruststoreType("BKS"); 
    connectionConfig.setTruststorePath("/system/etc/security/cacerts.bks"); 

2) Затем я добавил подключения слушателя для подключения XMPP.

3) Я добавил статический блок для ReconnectionManager, чтобы параметр соединения был инициализирован.

Когда я запустил приложение на реальном устройстве, а затем переключил интернет-соединение с WIFI на 3G и наоборот, прослушиватель соединения сыграл свою важную роль. Он пытается повторно подключиться, и потерянное соединение xmpp снова было восстановлено.

Важно помнить, что метод connect для соединения xmpp в перегруженном методе connectlistener, т. Е. ConnectionClosed().

Спасибо Карналу за помощь и сотрудничество, данные вами.

До свидания.

+0

Не проблема, товарищ! – Carnal

0

добавить этот код:

статический {

try 
    { 
     Class.forName("org.jivesoftware.smack.ReconnectionManager"); 
    } 
    catch (ClassNotFoundException e3) 
    { 
     Log.e("TextNS", "class not found exception maintain connnection 75 : +e3.toString()); 
    } 
    catch (Exception e2) 
    { 
     e2.printStackTrace(); 
    } 
} 

добавить подключение к у слушателя xmppconnetion

для определения состояния соединения

+0

Это на самом деле то, что я добавил, и проблема была решена. Спасибо за ценный ответ. –

Смежные вопросы