启用 IQProvider 时,Smack 无法识别 type= "result"节



tl;dr

注册IQProvider时,我在StanzaListener中没有得到答案,我可能不太清楚IQProvider是如何工作的,但不知道从哪里开始。


我正在使用Smack发送和接收一些自定义IQ。这是我用来发送自定义IQ的代码。

iq.setFrom(JidCreate.fullFrom(CLIENT_USER));
iq.setTo(JidCreate.fullFrom(SERVER_USER));
xmppConnection.sendIqWithResponseCallback(iq, new StanzaListener() {
    @Override
    public void processPacket(Stanza packet) throws SmackException.NotConnectedException, InterruptedException {
        handleReply((WedooIQ) packet);
    }
}, new ExceptionCallback()
    @Override
    public void processException(Exception exception) {
        exception.printStackTrace();
    }
});

好吧。我确信发送了正确的答案,因为调试模式正在向我显示我想要看到的内容。结果节是由另一端的节点客户端提供的,所以这与这个问题无关。


以下是我的问题:我在StanzaListener()中得到了一个答案,但当然,如果我不想自己完成所有解析,我就不能用它做太多。我被告知要实现IQProvider并注册它——所以我这样做了:

ProviderManager.addIQProvider(Xxx.ELEMENT_NAME, Yyy.NAMESPACE, new ZzzIQProvider());

但当这被注册时,我再也得不到答案了,相反,在那5秒之后出现了超时异常

System.err: org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Waited for response using: IQReplyFilter ......

我在想IQProvider会让它变得更好,这样我就可以在StanzaListener中从上面得到一个更可用的对象。这是怎么回事?我已经在smack主页上阅读了有关这方面的文档,但我不知道如何接收IQ,我只知道如何注册提供商,而不会对我产生任何明显的影响。


可能只是错过了一些小东西,我已经坐了好几天了,所以非常感谢你的帮助。

我的解析器中出现了一个错误,没有将所有标记读取到底。因此,它会在没有任何通知的情况下默默地失败。确保您正确地读取了整个XML,同时在类之前不要滥用解析器或解析器

如果不是这样的话,下面是@ccalvinfly在评论中的另一个想法:

我也面临同样的问题,我在我的IQProvider上发现了一个错误。IQProvider返回具有不同节id的IQ,因此StanzaListener不会使用StanzaFilter捕获结果IQ。。。。。

相关内容

最新更新