XMPP 服务器连接错误

Posted

技术标签:

【中文标题】XMPP 服务器连接错误【英文标题】:XMPP Server Connection Error 【发布时间】:2015-08-11 10:28:00 【问题描述】:

成功登录 XMPP 服务器后出现错误。请给我建议。提前致谢。

错误:java.lang.IllegalArgumentException:servertime 不是 org.jivesoftware.smack.packet.Message$Type 中的常量

D/SMACK﹕ RECV (0): <message from='sujewan@50.26.201.39/Smack' to='sujewan@50.26.201.39/Smack' type='servertime' timestamp='1439287908'/><presence from='sujewan@50.26.201.39/Smack' to='sujewan@50.26.201.39/Smack' xml:lang='en' id='I0TA4-8'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='NfJ3flI83zSdUDzCEICtbypursw='/></presence>

W/AbstractXMPPConnection﹕ Connection closed with error
        java.lang.IllegalArgumentException: servertime is not a constant in org.jivesoftware.smack.packet.Message$Type
                at java.lang.Enum.valueOf(Enum.java:200)
                at org.jivesoftware.smack.packet.Message$Type.valueOf(Message.java:607)
                at org.jivesoftware.smack.packet.Message$Type.fromString(Message.java:644)
                at org.jivesoftware.smack.util.PacketParserUtils.parseMessage(PacketParserUtils.java:229)
                at org.jivesoftware.smack.util.PacketParserUtils.parseStanza(PacketParserUtils.java:151)
                at org.jivesoftware.smack.AbstractXMPPConnection.parseAndProcessStanza(AbstractXMPPConnection.java:947)
                at org.jivesoftware.smack.tcp.XMPPTCPConnection.access$400(XMPPTCPConnection.java:139)
                at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPConnection.java:982)
                at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$200(XMPPTCPConnection.java:937)
                at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:952)
                at java.lang.Thread.run(Thread.java:818)

【问题讨论】:

【参考方案1】:

当客户端收到带有type 属性且非标准值servertime&lt;message/&gt; 节时,似乎会发生这种情况:

<message from='sujewan@50.26.201.39/Smack'
         to='sujewan@50.26.201.39/Smack'
         type='servertime'
         timestamp='1439287908'/>

Section 5.2.2 of RFC 6121 说:

如果应用程序接收到没有“类型”属性的消息,或者应用程序不理解所提供的“类型”属性的值,它必须认为该消息是“正常”类型的(即“正常”是默认)。

所以这是 Smack 中的一个错误:它不应该在非标准类型值上崩溃。这应该报告给 Smack 开发人员。


另一方面,servertime 消息是扩展 XMPP 的一种不同寻常的方式。相同的 RFC 部分说:

如果包含,“类型”属性必须具有以下值之一:

因此,不允许将 type 设置为 servertime。添加新消息类型的常用方法是嵌入具有特定命名空间的 XML 元素,例如:

<message from='sujewan@50.26.201.39/Smack'
         to='sujewan@50.26.201.39/Smack'>
   <servertime xmlns='servertime' timestamp='1439287908'/>
</message>

(理想情况下,xmlns='servertime' 放置一个您可以控制的 HTTP URL。)


另一方面,对于传达时间信息,您可能会发现XEP-0202: Entity Time 满足您的需求。在 3.4.1 版本中支持 XEP-0202 was added 到 Smack。

【讨论】:

以上是关于XMPP 服务器连接错误的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 Smack 连接 XMPP 服务器并出现错误

当用户遇到错误或与 XMPP 断开连接时重新连接 XMPP

Android xmpp错误主机未知

XMPP android中的连接因错误而关闭

我正在为 FACEBOOK 创建 XMPP 客户端。 xmpp 连接错误.xmpp.login(apiKey + "|" + sessionKey, sessionSecret,

连接期间的Python-xmpp HostUnknown错误