您的位置:首页 > 其它

stream:error (text) 错误分析

2014-11-04 12:00 696 查看
错误描述:

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)错误的情况,现在记不清是啥情况下了,所有就先这样吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐