笑忘书客 2019-10-17 16:39 采纳率: 33.3%
浏览 238

为什么我在已经设置离线,断开连接后再重新登录openfire,会偶现报409的错误(资源冲突)?

我退出时的代码实现,这里的在退出后重新启动service是因为我的登录方法是写在service里面的:

public static void logOut(final Context mContext) {
  //这里需要先将登陆状态改变为“离线”,再断开连接,不然在后台还是上线的状态
        Presence presence = new Presence(Presence.Type.unavailable);
        try {
            XmppConfig.getInstance(mContext).sendStanza(presence);

            if (connection.isConnected()) {

                connection.disconnect();
                connection.instantShutdown();


            }
            connection = null;
            Intent intent = new Intent(mContext, ChatService.class);
            mContext.startService(intent);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

最后报的错误:

//我们向服务器发送的IQ消息,进行最后的鉴权
D/SMACK: SENT (1): <iq id='7XCqy-82' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>Android</resource></bind></iq>
//服务器向我们返回的IQ结果:鉴权失败(<error code="409" type="cancel"><conflict xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>)
D/SMACK: RECV (1): <iq type="error" id="7XCqy-82" to="win-arbj87ei5km/22nzst74hd"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>Android</resource></bind><error code="409" type="cancel"><conflict xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-29 22:25
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Android中,当服务在运行时突然被关闭或重启,可能会导致之前的会话或资源冲突。这主要是因为SMACK框架中的XMPPConnection对象在每次接收到新连接时都会重置,这意味着如果一个会话正在尝试建立新的连接,而另一个会话也正在进行相同的操作,就会引发冲突。

    为了解决这个问题,你可以考虑以下几种解决方案:

    1. 增加等待时间: 在发送和接收数据之前,可以增加一些延迟,例如通过使用XMPPConnectionsetTimeout()方法来设置超时时间。

    2. 使用XMPPConnectionsetAutoReconnect()方法: 如果你希望即使在断开连接的情况下仍然能够尝试再次连接,可以使用这个方法来设置自动重连功能。

    3. 使用XMPPConnectionclose()方法: 当你不再需要一个连接时,可以直接调用close()方法来关闭它,而不是简单地断开连接。

    4. 使用XMPPConnectionsetConnectTimeout()方法: 设置一个更短的超时值,以减少与服务器之间的连接中断。

    5. 使用XMPPConnectionsetKeepAliveInterval()方法: 设置一个较低的间隔值,以确保即使连接断开,也会定期尝试重新连接。

    6. 使用XMPPConnectionsetServerId()方法: 如果你的服务器ID发生更改,请确保在发送和接收消息前更新此信息,避免出现冲突。

    7. 使用XMPPConnectionsetUserName()方法: 如果用户名发生了变化,请确保在发送和接收消息前更新此信息,避免出现冲突。

    具体的实现方式取决于你的具体需求和业务场景。

    评论

报告相同问题?