背景
我在Android上使用aSmack for XMPP实现了一对一聊天。我也能够发送和接收IQ消息。
问题是:
我无法发送和接收自定义IQ消息。例如,如果我想发送智商
<iq type='get'
to='ssmack@web.mystudios.com/mack'>
<query xmlns='http://jabber.org/protocol/disco#items'/>
</iq>
aSmack适用于此IQ,因为它不是自定义的,但是如果我将此处的name space
从disco#items
更改为Match
它将无效,它将向服务器发送响应说明
<error code='503'
type='cancel'>
<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
</error>
并且此响应是从我的客户端发送的。但我试图调试它,我在所有接收和发送数据包代码上放置了断点。但它没有进入那里。
我接收数据包的代码是:
connection.addPacketListener(new PacketListener() {
@Override
public void processPacket(Packet p) {
// TODO Auto-generated method stub
String fromName1 = StringUtils.parseBareAddress(p.getFrom());
Log.i("XMPPClient", "Got text [" + p.toXML() + "] from [" + fromName1 + "]");
m1=p.getFrom();
mHandler.post(new Runnable() {
public void run() {
setListAdapter();
recieve.setText(m1);
}
});
我想我需要添加一些侦听器来获取自定义响应。有人可以指导我吗?
答案 0 :(得分:1)
代码不完整。 addPacketListener()
有两个论点。
我怀疑您没有在接收方注册自定义智商的提供商,这就是为什么它会返回<service-unavailable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
您可能需要阅读一些文档:
答案 1 :(得分:-1)
您需要使用ServiceDiscoveryManager并注册您的自定义命名空间,如下所示:
ServiceDiscoveryManager sm = ServiceDiscoveryManager.getInstanceFor(connection);
sm.addFeature("your:namespace");
查看Smack sources,所有内部IQ处理程序都将自身添加为功能,按命名空间匹配传入的查询数据包,并构建结果或错误回复。