如何使用 libstrophe 构建一个 jabber 客户端

Posted

技术标签:

【中文标题】如何使用 libstrophe 构建一个 jabber 客户端【英文标题】:How to build a jabber client using libstrophe 【发布时间】:2012-06-30 21:32:58 【问题描述】:

我正在尝试使用 libstrophe 库制作一个简单的 Jabber 客户端。

到目前为止一切进展顺利,除了我需要澄清的一件事。

也就是说,我应该如何(持续地)知道联系人的状态(即在线/离线),以便我可以将其显示给我的程序的用户?同样,我应该如何请求用户名册?

我查看了 libstrophe 提供的 roster.c 示例,但只打印了一次名册。在一个真实的应用程序中,我需要不断地请求/更新它,以便在应用程序中显示用户添加的任何新联系人等。

因此,基本上,我不清楚如何确保始终在用户的联系人列表中显示最新的花名册和人员的最新状态。

例如,我是否应该在某个预定义的时间间隔请求名册?

【问题讨论】:

看起来您正在寻找“名册推送”:tools.ietf.org/html/draft-ietf-xmpp-3921bis-06#section-2.1.5 【参考方案1】:

名册和出席是 2 个不同的主题。

当您登录时,您通常会请求您已经在做的花名册。当您的联系人列表在会话期间发生变化时,您会收到包含更新后联系人的名册推送。这是一个节。其他登录的客户是否操纵了我们您的客户的名册并不重要。

所有订阅的联系人都存在在线状态。

您必须使用 xmpp_handler_add

设置处理程序
    在线状态,存在节 名册推送,iq 节与命名空间 jabber:iq:roster 的查询

【讨论】:

为了获得名册推送,我会为jabber:iq:roster 注册一个处理程序。存在节的名称空间是什么? jabber:iq:presence 之类的东西? presence 在标签 和命名空间 jabber:client 中,名册推送有标签 ,命名空间也是 jabber:client,有效负载(查询标签)的命名空间是jabber:iq:roster. 嗯,我一定是做错了什么。我像这样注册了存在的处理程序:xmpp_handler_add(conn, presence_handler, "jabber:client", "presence", NULL, ctx); 但它永远不会被调用...不是在开始时(所以我得到初始存在信息),而不是当我的程序运行时有人注销时... 试试这个:xmpp_handler_add(conn, presence_handler, NULL, "presence", NULL, ctx);此处理程序不需要命名空间。 行得通,谢谢。对于另一个处理程序,我做了xmpp_handler_add(conn, roster_push_handler, "jabber:iq:roster", "iq", NULL, ctx);,它似乎也可以工作。感谢您的回答,接受,+1,奖励赏金:)

以上是关于如何使用 libstrophe 构建一个 jabber 客户端的主要内容,如果未能解决你的问题,请参考以下文章

phabricator bot json 配置文件中“join”和“notification.channels”字段的使用

Python 和 EJABBERD/XMPP [关闭]

我如何在一些全局击键上使用 Python 或 C++ 将一些文本粘贴到 linux 中的当前活动应用程序

使用 PHP 连接到 Facebook 聊天?

几个第三方库发图片

使用 gpg 加密的机器人