【问题标题】:ReconnectionManager in asmackasmack 中的 ReconnectionManager
【发布时间】:2013-10-07 16:10:20
【问题描述】:

我有一个Android项目,需要使用asmack库来实现实时聊天。

关键特性是重新连接机制,这意味着我的应用程序可以在互联网连接丢失时自动重新连接。

这是我的代码 sn-p:

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

但是每当我关闭然后打开 Wifi 时都会出现此错误:

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)

谁能解决这个错误,请帮帮我!

【问题讨论】:

  • 请分享您正在使用的 aSmack 库的版本。我正在使用 asmack-android-18-0.8.9beta4.jar,使用您上面的代码 sn-p,当我在我正在使用的 Nexus3 手机上关闭和打开 wifi 时,我没有看到您遇到的错误.
  • 其实我不再使用 asmack 库了:)。无论如何,非常感谢!
  • 我很好奇,你现在用的是什么?
  • 我希望我的服务器能够主动向客户端(Android)发送一些消息,所以我考虑使用 GCM 或 XMPP。我尝试使用它们,然后比较它们的延迟。我发现在大多数情况下,XMPP 的延迟较小,但 GCM 的延迟是可以接受的(至少在我的应用程序中)。所以我决定使用 GCM 而不是 XMPP :)

标签: android xmpp smack asmack


【解决方案1】:

使用最新的 smack api - 我使用的是 4.1.0

然后像下面这样设置重新连接:

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

它会按照Here的描述自动重新连接

【讨论】:

  • 你知道在你已经连接的情况下是否必须这样做吗?如果您在尝试连接时没有互联网连接,是否必须在没有重新连接管理器的情况下尝试连接,否则它会自行连接?
【解决方案2】:

Asmack 正确支持重新连接,唯一的问题是您正在使用 SASL 连接,所以这会出现问题,因为您在关闭 Wi-Fi 时再次尝试相同的连接。尝试设置 SASL false

connConfig.setSASLAuthenticationEnabled(false);

需要手动断开连接

connection.disconnect();

【讨论】:

    【解决方案3】:

    在开始设置所有内容时,调用

    ReconnectionManager.setEnabledPerDefault(true);
    

    从那时起创建的连接将自动重新连接。

    【讨论】:

      【解决方案4】:

      不要使用 ASMACK 中实现的重连机制。

      用途:

          connConfig.setReconnectionAllowed(false);
      

      相反,您应该创建侦听ConnectivityManager.CONNECTIVITY_ACTION 的BroadcastReceiver。 当连接到 WIFI 或其他网络时,您将在 BroadcastReceiver 中收到回调onReceive。

      【讨论】:

      • 这种方式不好。您可以检查一下这种情况:您的智能手机连接到一个AP,如果这个AP失去互连(假设您从AP上拔下有线电缆),这种情况下您的智能手机将无法实现互联网连接的变化。
      • @duong_dajgja 你是对的,但是 Asmack 的重新连接管理器中存在错误。也许这个错误在最新版本中已修复。此外,如果重新连接管理器是固定的,那么您应该结合两种技术,以免在没有活动网络时尝试重新连接。调用时是否会发生:connection.connect();
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多