stream:error (text) 错误分析

错误描述:

xmpp 聊天,用asmack jar包,当用户中,日志一直显示 stream:error (text) 等错误信息

错误原因:

我使用的是 asmack-android-8-0.8.1.1.jar ,这个jar包对帐号异地登录处理方式跟我之前的jar不同,之前如果被别人挤下线,会报 stream:error (conflict) 错误,在代码中捕捉到这个错误就能做相应操作了,由于新换jar包的原因,导致正在使用的帐号被别人登录时挤下,然后报出stream:error (text) 这样的错误,而我的代码里没有做任何处理,加上自己的重连机制,就出现了不断重连再被挤下,以此循环。。。


解决方案:

知道了错误原因,就好办了,我根据错误提示找到了jar包中出错源码部分,在org.jivesoftware.smack.util.PacketParserUtils类中,部分代码:

<span style="font-size:24px;"> public static StreamError parseStreamError(XmlPullParser parser) throws IOException,XmlPullParserException {
    StreamError streamError = null;
    boolean done = false;
    while (!done) {
        int eventType = parser.next();
<span style="white-space:pre">	</span>if (eventType == XmlPullParser.START_TAG) {
            streamError = new StreamError(parser.getName());
        }
        else if (eventType == XmlPullParser.END_TAG) {
            if (parser.getName().equals("error")) {
                done = true;
            }
        }
    }
    return streamError;
}</span>

就是这里的处理问题,导致帐号在别处登录时,被人挤下而报出stream:error (text) 的错误,我将其改成这样:

<span style="font-size:24px;">public static StreamError parseStreamError(XmlPullParser parser) throws IOException,XmlPullParserException {
    StreamError streamError = null;
    boolean done = false;
    while (!done) {
        int eventType = parser.next();

        boolean isConflict = !(streamError != null && "conflict".equals(streamError.getCode()));
	if ((eventType == XmlPullParser.START_TAG) && isConflict) {
            streamError = new StreamError(parser.getName());
        }
        else if (eventType == XmlPullParser.END_TAG) {
            if (parser.getName().equals("error")) {
                done = true;
            }
        }
    }
    return streamError;
}</span>
其中加了句conflict字符串的判断,这样被别人挤下时,就会报出 stream:error (conflict)的错误了,这样我代码中就会捕捉到这个错误,并进行处理了,哦也。。。。


还有一种方式,就是在代码中把对stream:error (conflict)的错误处理,换成对stream:error (text)的错误处理,不过这样貌似有点问题,xmpp中,默认就是以conflict节点作为被别人挤下的标志,如果出现stream:error (conflict)的错误,一看便知是有别人在登录你的帐号,而text的话就不一定是了,我在之前就遇到过不是被别人挤下也报stream:error (text)错误的情况,现在记不清是啥情况下了,所有就先这样吧



你可能感兴趣的:(android,XMPP,asmack)