【问题标题】:Unable to reconnect XMPP on internet connectivity changed无法在 Internet 连接上重新连接 XMPP 已更改
【发布时间】:2015-04-20 19:52:32
【问题描述】:

我正在使用 asmack 开发一个聊天应用程序。我能够建立 xmpp 连接并可以正确发送和接收消息。但是,如果我将互联网连接从 WIFI 更改为#G,我希望重新连接 XMPP 连接,反之亦然。要收听连接更改,我有一个广播接收器,它成功通知连接更改。如果我得到连接为假,我会检查 xmpp 连接是否为空。如果它不为空,我将其设置为空。当互联网连接时,我尝试重新连接 xmpp 连接。最主要的是我第一次启动我的应用程序,成功建立了 xmpp 连接并且正确完成了 TLS 握手。我已经指定了信任库逻辑如下:

    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 连接,并让我知道是否有任何方法可以检索会话 id,以便我可以与服务器检查是否有任何 xmpp 连接相对于请求的会话 id 处于活动状态。

【问题讨论】:

标签: java android xmpp


【解决方案1】:

我已经解决了这个问题,我也找到了解决方案。解决方法如下:

1) 首先,我将我在问题中给出的信任库逻辑更改为以下

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

2) 然后我为 XMPP 连接添加了一个连接监听器。

3) 我为 ReconnectionManager 添加了一个静态块,以便初始化连接参数。

当我在真实设备上运行应用程序,然后将互联网连接从 WIFI 切换到 3G 或反之时,连接监听器发挥了重要作用。它尝试重新连接,丢失的 xmpp 连接再次重新建立。

有一点很重要,一定要在connectionlistener的覆盖方法中提到connect方法来建立xmpp连接,即connectionClosed()。

感谢Carnal给予您的帮助与合作。

再见。

【讨论】:

    【解决方案2】:

    添加此代码:

    静态的 {

        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

    检测连接状态

    【讨论】:

    • 这实际上是我添加的并解决了我的问题。感谢您的宝贵回复。
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2022-08-11
    • 2014-12-12
    • 1970-01-01
    相关资源
    最近更新 更多