【问题标题】:How to send Custom IQ stanzas to another user using smack library?如何使用 smack 库将自定义 IQ 节发送给另一个用户?
【发布时间】:2016-12-11 20:51:06
【问题描述】:

这是获取名册的示例 IQ 节

<iq from="alice@wonderland.lit/pda" id="rr82a1z7"
type="get">
    <query xmlns="jabber:iq:roster"/>
</iq>

从此standard specification,可以通过设置“TO”属性将 Iq 节定向到特定用户,以便 xmpp 服务器将 IQ 节转发到“TO”属性中指定的 JID(完整 Jabber ID),@ 987654322@

但是当我查询 IQ 节以满足我的需要时

<iq from="alice@wonderland.lit/pda" id="rr82a1z7"
to="alice@wonderland.lit/Smack"
type="get">
    <UserDetails xmlns="http://www.test.org/User/">
        <userName>username</username>
    </UserDetails>
</iq>

Stanza 被转发到“alice@wonderland.lit”,但我从 Openfire 服务器收到错误条件“​​未实现”的 IQ 节。

有没有办法摆脱这个错误并得到结果?

我按照tutorial 生成客户端。

我可以看到正在接收自定义 Stanza 的 wireshark 痕迹,但看不到“myIQListener”被调用?

问题:

  • 我还缺少任何其他中间步骤吗?
  • 还有其他更好的例子吗?

【问题讨论】:

  • 要将节发送到另一个名册,您需要在名册订阅列表中。
  • @GirishKumar 啊哈,谢谢你的信息,我会核实
  • 该示例有效,它是命名空间中的拼写错误,需要一整天才能修复。再次证明检查你自己的代码是否有错别字应该是第一要务,而不是对你所拥有的知识感到不安全:)

标签: java xmpp openfire smack xmppframework


【解决方案1】:

这就是我解决自己问题的方法。

  • 使用完整的 jabber ID(包括资源)

  • 由于 smack 库不理解自定义 IQ 节实现 拥有 IQProvider ,过滤并将其添加到您的连接中 解释here

【讨论】:

    【解决方案2】:

    您需要发送自己的&lt;presence type="subscribe" to="alice@wonderland.lit"/&gt; 或需要在其他用户的名单中:

    参考:here

    Deny messages from non-roster users in Openfire

    【讨论】:

    • 我已经验证并且在wireshark跟踪中我可以看到openFire Xmpp服务器将请求转发到客户端地址(完整的jabber ID),甚至在这个规范tools.ietf.org/html/rfc6120#page-105它声明“除非消息是发送到已连接客户端帐户的裸 JID。在接收到带有“to”地址的消息节后,服务器应该尝试将其路由或传递给预期的接收者(有关 XML 的一般路由和传递规则,请参见第 10 节节)”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-16
    • 2011-09-17
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多