ejabberd有时在添加名册时无法设置昵称

Posted

技术标签:

【中文标题】ejabberd有时在添加名册时无法设置昵称【英文标题】:ejabberd can not set nickname when add roster sometimes 【发布时间】:2015-07-03 02:37:35 【问题描述】:

我使用 ios xmppframework 和 ejabberd 作为 xmpp 服务器。当我添加带昵称的花名册时,有时我可以设置昵称,有时我无法设置昵称。我发送到服务器的数据包是:

2015-07-03 10:19:24:144 pigai[36644:3a0b] The nick is songxiao
2015-07-03 10:19:24:144 pigai[36644:3a0b] SEND: <iq type="set" xmlns="jabber:client" id="roster-remotely-managed"><query xmlns="jabber:iq:roster"><item jid="xh1@192.168.1.67" name="songxiao"/></query></iq>
2015-07-03 10:19:24:144 pigai[36644:800b] SEND: <presence type="subscribe" to="xh1@192.168.1.67"><x xmlns="vcard-temp:x:update"><photo>c769b958f910fb6bfde4e8131385cc5ad2d95e0b</photo></x></presence>
2015-07-03 10:19:24:576 pigai[36644:3a0b] RECV: <iq xmlns="jabber:client" from="test3@192.168.1.67" to="test3@192.168.1.67/iPhone" id="push2270407375" type="set"><query xmlns="jabber:iq:roster" ver="6e3b72a923e4574fac87e8e89f08eee251cf73c8"><item subscription="none" name="songxiao" jid="xh1@192.168.1.67"/></query></iq>
2015-07-03 10:19:24:576 pigai[36644:3a0b] RECV: <r xmlns="urn:xmpp:sm:3"/>
2015-07-03 10:19:24:576 pigai[36644:3a0b] RECV: <iq xmlns="jabber:client" from="test3@192.168.1.67" to="test3@192.168.1.67/iPhone" id="roster-remotely-managed" type="result"/>
2015-07-03 10:19:24:577 pigai[36644:3a0b] RECV: <r xmlns="urn:xmpp:sm:3"/>
2015-07-03 10:19:24:577 pigai[36644:3a0b] RECV: <iq xmlns="jabber:client" from="test3@192.168.1.67" to="test3@192.168.1.67/iPhone" id="push2639732641" type="set"><query xmlns="jabber:iq:roster" ver="b16ad5f42baf7c0fe11925ed879ac7ecb0bcfb85"><item ask="subscribe" subscription="none" jid="xh1@192.168.1.67"/></query></iq>
2015-07-03 10:19:26:602 pigai[36644:433] RECV: <r xmlns="urn:xmpp:sm:3"/>
2015-07-03 10:19:26:602 pigai[36644:433] SEND: <a xmlns="urn:xmpp:sm:3" h="15"/>
2015-07-03 10:19:26:808 pigai[36644:4b17] SEND: <a xmlns="urn:xmpp:sm:3" h="15"/>

昵称没有设置。从客户端来看,昵称是空的。从服务器端看,昵称没有存储在数据库中。

【问题讨论】:

您使用的是哪个版本的 ejabberd? ejabberd 版本是 15.04。 因为我用户的 jid 是数字。我无法在用户的花名册视图中显示号码。这就是为什么昵称非常重要的原因。这个问题困扰了我整整一周。我渴望得到解决方案。 因为我同时向服务器发送了 IQ 和 Presence。我猜服务器可能以错误的顺序处理这两条消息。也许服务器正在处理 IQ 将昵称写入数据库,但尚未完成。然后在从数据库中读取 nick 时处理 Presence,但那里没有 nick。也许它不是线程安全的?顺便说一句,我使用 mysql 作为数据库。 【参考方案1】:

这是一个应该可以正常工作的序列:

    发送出席信息订阅。 等待回复。 在名册项目上设置名称。

我们将看看我们是否可以改进以更好地处理这种情况。

【讨论】:

我猜为什么当我再次发送set nick name iq消息时,昵称设置成功。非常感谢。

以上是关于ejabberd有时在添加名册时无法设置昵称的主要内容,如果未能解决你的问题,请参考以下文章

使用 Strophe.js 名册插件和 Ejabberd 接收“订阅”状态

Ejabberd 如何将新用户添加到名册

Ejabberd 的名册管理

ejabberd 不会持久存储名册

无法从 ejabberd 服务器 15.09 路由自定义数据包

ejabberd -- 在 ejabberd 上设置昵称在我注销之前不会反映 Pidgin/Empathy