通过 XMPP 进行 XML RPC
Posted
技术标签:
【中文标题】通过 XMPP 进行 XML RPC【英文标题】:XML RPC via XMPP 【发布时间】:2012-05-31 22:23:24 【问题描述】:我目前正在尝试通过 XMPP 实现 XML RPC。我使用 Smack 作为客户端库,使用 Vysper 作为 XMPP 服务器。简化后,我的设置如下所示:
[client1] — [server] — [client2]
我想从客户端 1 调用客户端 2 上的方法。我创建了一个类型为 set 的 IQ,以及 from 和 to 元素以及 [1] 中所述的查询内容。简化示例:
<iq type='set' from='client1@localhost' to='client2@localhost' id='1'>
<query xmlns='jabber:iq:rpc'>
<methodCall>
<methodName>foo</methodName>
</methodCall>
</query>
</iq>
问题是,当从 client1 发送 IQ 时,我收到一个错误 IQ,并且没有任何内容提交给 client2。调查问题时,我在规范 [2] 中看到了这个声明:
服务器必须忽略名册“集”上的任何“收件人”地址,并且必须将任何名册“集”视为适用于发送者。 […]
我说得对吗,在这个星座中,两个客户端之间不可能有 Jabber-RPC?还是我对 Jabber-RPC 有根本的误解?
[1]http://xmpp.org/extensions/xep-0009.html
[2]http://xmpp.org/rfcs/rfc3921.html#roster
【问题讨论】:
【参考方案1】:看起来您将 Iq 节发送到客户端的裸 JID 而不是完整的 JID,即 client2@example.com
而不是 client2@example.com/resource
。
发送到裸 JID 的 Iq 节由服务器处理,不会路由到客户端。您实质上是在查询用户的帐户,而不是与特定的连接代理进行交互。通常,您总是希望指定收件人的完整 JID。
【讨论】:
谢谢@Lance,这有助于解决我的问题。我还有一些必须解决的 Vysper 特定问题(Vysper 目前代表它自己分配资源名称,而不是使用建议的客户端 (issues.apache.org/jira/browse/VYSPER-297),因此这涉及一些进一步的解决方法),但现在基本工作正常: ) 关于资源选择的提示:不要依赖它,因为它总是由服务器决定。您可能应该使用 Presence 来研究发现。以上是关于通过 XMPP 进行 XML RPC的主要内容,如果未能解决你的问题,请参考以下文章