在openfire中,如果发送某些特殊的字符(例如一些表情符合),会断开xmpp的连接,经查,是由以下的代码问题引起的:
src\java\org\jivesoftware\openfire\net\MXParser.java
protected char more() throws IOException, XmlPullParserException { final char codePoint = super.more(); // note - this does NOT return a codepoint now, but simply a (single byte) character! if ((codePoint == 0x0) || // 0x0 is not allowed, but flash clients insist on sending this as the very first character of a stream. We should stop allowing this codepoint after the first byte has been parsed. (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD) || ((codePoint >= 0x20) && (codePoint <= 0xD7FF)) || ((codePoint >= 0xE000) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) { return codePoint; } throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16)); }
由于在这里把特殊的字符当成了一个异常,所以openfire会断开连接。
解决方法:
把代码修改为如下:
@Override protected char more() throws IOException, XmlPullParserException { final char codePoint = super.more(); // note - this does NOT return a codepoint now, but simply a (single byte) character! if ((codePoint == 0x0) || // 0x0 is not allowed, but flash clients insist on sending this as the very first character of a stream. We should stop allowing this codepoint after the first byte has been parsed. (codePoint == 0x9) || (codePoint == 0xA) || (codePoint == 0xD) || //fix some emotion ((codePoint >= 0x20) && (codePoint <= 0xFFFD)) || ((codePoint >= 0x10000) && (codePoint <= 0x10FFFF))) { return codePoint; } throw new XmlPullParserException("Illegal XML character: " + Integer.parseInt(codePoint+"", 16)); }
[文章作者]曾健生
[作者邮箱]h6k65@126.com
[作者QQ]190678908
[新浪微博] @newjueqi
[博客]http://blog.csdn.net/newjueqi
http://blog.sina.com.cn/h6k65