ReconnectionManager в asmack

У меня есть проект на Android, который должен использовать библиотеку asmack, чтобы включить чат в реальном времени.

Ключевой особенностью является механизм переподключения, это означает, что мое приложение может автоматически переподключаться всякий раз, когда интернет-соединение теряется.

Вот мой фрагмент кода:

ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT);
connConfig.setSASLAuthenticationEnabled(true);
connConfig.setReconnectionAllowed(true);
XMPPConnection connection = new XMPPConnection(connConfig);

Но я получал эту ошибку всякий раз, когда я выключал и включал Wi-Fi:

10-01 21:43:26.942: W/System.err(13695): javax.net.ssl.SSLException: Write error: ssl=0x5a4ad348: I/O error during system call, Broken pipe
10-01 21:43:27.002: W/System.err(13695):    at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method)
10-01 21:43:27.012: W/System.err(13695):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:693)
10-01 21:43:27.012: W/System.err(13695):    at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167)
10-01 21:43:27.012: W/System.err(13695):    at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158)
10-01 21:43:27.012: W/System.err(13695):    at java.io.BufferedWriter.flush(BufferedWriter.java:124)
10-01 21:43:27.012: W/System.err(13695):    at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:210)
10-01 21:43:27.012: W/System.err(13695):    at org.jivesoftware.smack.PacketWriter.access$000(PacketWriter.java:42)
10-01 21:43:27.012: W/System.err(13695):    at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:78)
10-01 21:43:27.092: W/System.err(13695): javax.net.ssl.SSLException: Read error: ssl=0x5a4ad348: I/O error during system call, Connection timed out
10-01 21:43:27.092: W/System.err(13695):    at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_read(Native Method)
10-01 21:43:27.092: W/System.err(13695):    at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:651)
10-01 21:43:27.092: W/System.err(13695):    at java.io.InputStreamReader.read(InputStreamReader.java:244)
10-01 21:43:27.092: W/System.err(13695):    at java.io.BufferedReader.read(BufferedReader.java:310)
10-01 21:43:27.092: W/System.err(13695):    at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1496)
10-01 21:43:27.092: W/System.err(13695):    at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:979)
10-01 21:43:27.092: W/System.err(13695):    at org.kxml2.io.KXmlParser.next(KXmlParser.java:346)
10-01 21:43:27.092: W/System.err(13695):    at org.kxml2.io.KXmlParser.next(KXmlParser.java:310)
10-01 21:43:27.092: W/System.err(13695):    at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:326)
10-01 21:43:27.092: W/System.err(13695):    at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
10-01 21:43:27.092: W/System.err(13695):    at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:71)

Любой, кто может решить эту ошибку, пожалуйста, помогите мне!

4 ответа

Используйте последнюю версию API smack - я использую 4.1.0

Затем настройте повторное подключение, как показано ниже:

ReconnectionManager manager = ReconnectionManager.getInstanceFor(connection);
manager.enableAutomaticReconnection();

Он автоматически переподключится, как описано здесь.

Asmack правильно поддерживает повторное подключение, единственная проблема в том, что вы используете SASL-соединение, так что это создает проблему, потому что вы снова пытаетесь подключиться при отключенном Wi-Fi. Попробуйте установить SASL false

connConfig.setSASLAuthenticationEnabled(false);

требуется другое мудрое отключение вручную

connection.disconnect();

При настройке всего в начале звоните

ReconnectionManager.setEnabledPerDefault(true);

Затем соединения, созданные с этого момента, будут автоматически переподключены.

Не используйте механизм переподключения, который реализован в ASMACK.

Использование:

    connConfig.setReconnectionAllowed(false);

Вместо этого вы должны создать BroadcastReceiver, который прослушивает ConnectivityManager.CONNECTIVITY_ACTION. Когда происходит подключение к WIFI или другой сети, вы получите обратный вызов onReceive в BroadcastReceiver.

Другие вопросы по тегам