使用 EJABBERD-BUSINESS 版本在 SMACK 中恢复流后读取“重新绑定”数据包

Posted

技术标签:

【中文标题】使用 EJABBERD-BUSINESS 版本在 SMACK 中恢复流后读取“重新绑定”数据包【英文标题】:Read 'Rebind' Packet after stream resumption in SMACK with EJABBERD-BUSINESS Edition 【发布时间】:2016-03-10 15:10:15 【问题描述】:

我想阅读我发送到 ejabberd-business 版本服务器的 rebind 数据包的响应。 Smack 库在日志中打印我的数据包,但我不明白如何在我的应用程序中获取该数据包,就像我在 processPacket 中获取其他数据包一样。

检查SMACK的代码,它在XMPPTCPConnection->parsePackets()中失败。由于 parsePackets 只检查一些特定的标签,例如“message”、“iq”、“presence”等。而我的数据包以“rebind”开头。

我需要能够接收到这个数据包,因为如果重新绑定不成功,那么我应该开始登录过程。

那么,我需要对 Smack 库代码进行更改吗?或者有什么方法可以在不重新编译 SMACK 的情况下处理这个问题?

我正在尝试读取的数据包:

<rebind xmlns='my:namespace:rebind'/>

【问题讨论】:

你真的不应该发明新的***流媒体事件。您的“重新绑定”做了哪些标准 XMPP 无法实现的功能? 对不起,我现在正在编辑我的问题,它是一个商业版 ejabberd 服务器,所以我正在使用它的流恢复功能。 你不能使用 Smack 支持的 Stream Management (XEP-0198) 因为? 商务版自定义模块。 【参考方案1】:

确实,Ejabberd 商业版 (eBE) 确实实现了自定义“重新绑定”功能,类似于 Session Management 中的“恢复”功能(无论如何,ejabberd 支持 XEP-0198)。

我刚刚写了a small patch,将这个功能添加到了 Smack 4.2.0(在撰写本文时的主分支)。希望对您的客户开发有所帮助。请注意,您应该重复使用您的 Smack xmpp tcp 连接才能使此功能生效。

【讨论】:

+1 表示努力。自从我们使用原始 SMACK-4.1.6 代码以来,我做了同样的事情。使用processone fork可以吗? 是的,我们会在上面添加更多来自 eBE 的功能。 所以基本上我必须构建 SMACK 库并将 jars 放在 libs 文件夹中,这是我之前做过的,但无法传递此运行时错误:VerifyError.. "community.igniterealtime.org/thread/55269" 准确地说。你能确认一下我需要哪些罐子吗? 重新绑定后,创建IQ包报异常。 IQReplyFilter 类中的 conn.getUser() 给出 null .. 并出现以下异常:“必须设置本地(用户)JID。要么您没有配置一个,要么您至少没有连接一次”

以上是关于使用 EJABBERD-BUSINESS 版本在 SMACK 中恢复流后读取“重新绑定”数据包的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 汇编版本中使用前导零是不是合适?

如何使用视图在 php 中回显当前 Laravel 版本的版本?

在eclipse里面使用SVN,怎么实现版本回滚

在多版本php环境,指定composer使用的php版本

强制使用旧版本的 vuejs devtools 或下载旧版本

我的 MainActivity 在使用 android 旧版本(例如 oreo)时滞后,但在最新版本中运行良好,如何解决?