首页/新闻资讯/正文详情

如何用xmpp4cj管理联系人和在线状态:Roster与Presence完整实战指南

发布时间:2026/9/25 1:24:29 来源:云帆数科 栏目:资讯中心
如何用xmpp4cj管理联系人和在线状态:Roster与Presence完整实战指南
如何用xmpp4cj管理联系人和在线状态:Roster与Presence完整实战指南【免费下载链接】xmpp4cj一个模块化和可移植的开源XMPP客户端库项目地址: https://gitcode.com/Cangjie-TPC/xmpp4cjxmpp4cj是一个用仓颉语言实现的、模块化和可移植的开源XMPP 客户端库当前版本 v1.0.2。本文带你通过Roster 联系人管理与Presence 在线状态两大核心场景完整掌握如何在自己的 IM 应用中添加/删除联系人、订阅联系人并实时感知他人上线下线。一、先花1分钟认识 xmpp4cj xmpp4cj 采用高度模块化的架构核心能力按功能拆分为独立目录方便你按需取用模块目录职责本文涉及src/tcp/TCP 传输层连接✅src/packet/报文模型Presence、IQ 等✅src/filter/报文过滤器✅src/feature/监听器等扩展特性✅src/connection/连接管理与状态机✅src/jid/JIDXMPP 地址工具✅ 所有功能都围绕一个核心对象XMPPTCPConnection展开构建配置 → 建立连接 → 登录 → 收发报文。二、Roster 联系人管理实战 2.1 Roster 是什么为什么用 IQ 报文模拟Roster 是 XMPP 协议中的通讯录机制命名空间jabber:iq:roster。当前版本 xmpp4cj 尚未内置完整的 Roster 模块官方推荐使用自定义 Stanza 发送 IQ 报文来模拟完整流程——这也是理解 XMPP 协议最直观的方式。官方示例详见 README.md 中的联系人章节。2.2 三步完成添加、查询、删除联系人以添加联系人为例只需继承Stanza并重写toXML()把标准 IQ 报文交给连接对象发送即可// 添加联系人 class ElementAddFriend : Stanza { public override func toXML(enclosingNamespace: ?XmlEnvironment): ToString { return iq xmlnsjabber:client id1 typesetquery xmlnsjabber:iq:rosteritem jidfriendxmpp.testserver/item/query/iq } // ... } let conn getConn() // 已登录的连接 conn.sendStanza(ElementAddFriend()) // 添加联系人 conn.sendStanza(ElementListFriend()) // 查询联系人列表 conn.sendStanza(ElementRemoveFriend())// 删除联系人item 带 subscriptionremove三种关键报文的 XML 特征记住它们就掌握了 Roster 全流程操作报文特征说明添加联系人typesetitem jid...在对方 Roster 中写入本方 JID查询列表typeget 空query/服务器返回全部item删除联系人typesetsubscriptionremove从 Roster 中移除该 JID2.3 用调试器观察 Roster 交互报文 Roster 是双向交互流程新手最推荐打开官方调试器直观看到每一条请求与应答let config XMPPTCPConnectionConfiguration .builder() .setXmppDomain(xmpp.testserver) .setSecurityMode(ConnectionConfigurationSecurityMode.disabled) .enableDefaultDebugger() // 关键立即打印全部报文 .build()联系人地址使用JIDJabber ID表示可通过 jid_create.cj 中的JidCreate.froms(local, domain, resource)安全构造它内置 LRU 缓存并自动完成 Stringprep 规范化比手写字符串更可靠。三、Presence 在线状态实战 与 Roster 不同Presence 在 xmpp4cj 中是完整实现的核心类位于 presence.cj 和 presence_builder.cj。3.1 一图看懂PresenceType类型≠ PresenceMode模式这是新手最容易混淆的概念官方注释里特意强调了二者的区别枚举值含义PresenceType状态类型available/unavailable在线 / 离线登出服务器才变 unavailablesubscribe/subscribed请求订阅 / 已同意订阅unsubscribe/unsubscribed请求取消订阅 / 已同意取消error/probe错误响应 / 状态探测PresenceMode状态模式available/chat空闲 / 可聊天away/xa/dnd离开 / 长时间离开 / 请勿打扰一句话记忆Type 管在不在线Mode 管什么状态——用户即使处于dnd请勿打扰模式Type 依然是available在线。3.2 构建并发送自定义在线状态通过PresenceBuilder链式 API几行代码即可设置在线 正在写代码的状态let presence: Presence PresenceBuilder() .ofType(PresenceType.available) // 在线 .setMode(PresenceMode.chat) // 可聊天 .setStatus(正在写代码) // 状态文字会显示给对方 .setPriority(5) // 多设备登录时的资源优先级 .build() conn.sendStanza(presence)发送后可用 presence.cj 提供的isAvailable()/isAway()便捷方法判断状态isAway()为 true 表示在线但处于 away/xa/dnd 模式。3.3 登录自动上线、断开自动下线免手动管理✅xmpp4cj 替你做好了 Presence 的生命周期管理见 abstract_xmpp_connection.cj登录成功后自动向服务器发送available上线广播断开连接时自动发送unavailable下线广播配置项setSendPresence(false)定义于 connection_configuration.cj可关闭登录时的自动上线行为适合需要自定义上线流程的场景。3.4 监听联系人上线/下线/订阅事件这是做联系人在线状态面板的关键一步——注册一个StanzaListener并用PresenceTypeFilter精确过滤你要的状态过滤器实现见 presence_type_filter.cj// 监听上线事件 conn.addStanzaListener( SimpleStanzaListener { stanza, _ let p (stanza as Presence) println(${stanza.getFrom()} 上线了: ${p.getStatus()}) }, PresenceTypeFilter.AVAILABLE // 只响应 available )PresenceTypeFilter为每种状态都提供了静态常量AVAILABLE、UNAVAILABLE、SUBSCRIBE、SUBSCRIBED、UNSUBSCRIBE、UNSUBSCRIBED、PROBE一行代码即可精准订阅感兴趣的事件监听器接口定义见 stanza_listener.cj。3.5 进阶Presence 拦截器如果你的业务需要在状态广播发出前统一加工例如强制附加状态文字、改写优先级可以使用 Presence 拦截器conn.addPresenceInterceptor( HashableConsumer { builder builder.setStatus(来自我的IM客户端) // 拦截并二次加工 }, LambdaPredicate { _ true } )拦截器与监听器是 xmpp4cj 的两大扩展点官方用法可参考 README.md 的拦截器示例。四、新手常见问题速查 ❓Q1联系人加上了但为什么收不到对方的状态→ Roster 是双向订阅机制对方需回复subscribed表示同意后才能互相接收 Presence。建议打开调试器检查 subscribe 交互是否完整。Q2available和away到底选哪个→ 二者不在同一维度away是 Mode模式Type 仍应保持available。只有用户真正登出Type 才变为unavailable。Q3多设备登录手机 PC如何决定消息发给谁→ 靠setPriority设置资源优先级服务器会把点对点消息默认投递给优先级最高的资源。Q4如何验证我发的报文是否符合协议→ 使用enableDefaultDebugger()打开完整报文打印对照本文第二、三节的 XML 结构逐字段检查。五、总结 本文带你用 xmpp4cj 完整走通了 IM 应用的两条主线Roster 联系人通过jabber:iq:roster命名空间的 IQ 报文实现添加、查询、删除联系人三步流程Presence 在线状态区分 Type 与 Mode用PresenceBuilder构建自定义状态用PresenceTypeFilter监听状态变化并享受登录/断开时自动上下线的省心设计。掌握这些后你已经可以基于 xmpp4cj 搭建一个具备完整联系人 状态能力的 XMPP 客户端了。核心源码索引presence.cj、presence_builder.cj、presence_type_filter.cj、README.md。【免费下载链接】xmpp4cj一个模块化和可移植的开源XMPP客户端库项目地址: https://gitcode.com/Cangjie-TPC/xmpp4cj创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

tsfresh 工具层全解析:DataFrame 规范化、滚动切窗与特征计算分发机制
tsfresh 工具层全解析:DataFrame 规范化、滚动切窗与特征计算分发机制

特征工程机器学习数据分析 【免费下载链接】tsfresh Automatic extraction of relevant features from time series: 项目地址: https://gitcode.com/gh_mirrors/ts/tsfresh 点击查看 免费下载 导读:本文围绕 tsfresh 的 tsfresh.utilities 工具包展开&… · 2026/9/25 1:24:29

英飞凌AURIX TC264烧录实战:DAP miniWiggler与MemTool避坑指南
英飞凌AURIX TC264烧录实战:DAP miniWiggler与MemTool避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:24:29

RS232电路设计全解析:从芯片选型到PCB布局的实战指南
RS232电路设计全解析:从芯片选型到PCB布局的实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:24:23

使用 AWS SDK for Java 2.x 管理 AWS Lambda 函数:完整场景实战指南
使用 AWS SDK for Java 2.x 管理 AWS Lambda 函数:完整场景实战指南

示例工程教程后端 【免费下载链接】aws-doc-sdk-examples Welcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below. 项目地… · 2026/9/25 7:51:16

Apache Pulsar 模块化负载管理器(Modular Load Manager):启用方法、验证手段与源码级实现解析
Apache Pulsar 模块化负载管理器(Modular Load Manager):启用方法、验证手段与源码级实现解析

消息队列后端流处理 【免费下载链接】pulsar Apache Pulsar - distributed pub-sub messaging system 项目地址: https://gitcode.com/gh_mirrors/pulsar28/pulsar 点击查看 免费下载 在 Pulsar 集群中,命名空间 bundle 如何分配到哪个 broker&#xff… · 2026/9/25 7:51:16

安卓逆向助手:抓包脱壳反编译全流程脚本化实战
安卓逆向助手:抓包脱壳反编译全流程脚本化实战

简介:安卓逆向助手是一款面向Android应用开发者与安全研究人员的图形化逆向工具,旨在降低APK反编译与分析门槛,让初学者也能快速理解应用内部结构。它集成dex2jar、JD-GUI、apktool、baksmali等常用组件,支持一键将Dalvik字节码转… · 2026/9/25 7:50:58

通信驱动的CRM工作台:DeskcommCRM设计思路与落地实践
通信驱动的CRM工作台:DeskcommCRM设计思路与落地实践

最近大半年我在推进一个项目,内部代号 DeskcommCRM,聊的人不多,但用起来确实和传统 CRM 是两个思路。它不是那种把客户信息塞进数据库就完事的系统,而是把“客户关系”这件事重新拉回到桌面上——电话、邮件、会话、跟进记录&… · 2026/9/25 7:50:45

SPL 迁移到 Axiom APL 实战指南:基于 spl-to-apl 技能的完整查询翻译手册
SPL 迁移到 Axiom APL 实战指南:基于 spl-to-apl 技能的完整查询翻译手册

后端前端AI 技能AI 插件搜索引擎 【免费下载链接】clawhub Skill Plugin Registry for OpenClaw 项目地址: https://gitcode.com/gh_mirrors/mo/clawhub 点击查看 免费下载 本指南围绕本仓库 .agents/skills/spl-to-apl/ 目录下的 SPL→APL 翻译技能展开&#xff… · 2026/9/25 7:50:39

Solaar 内部实现剖析:Linux 下 Logitech HID++ 设备管理的三层架构
Solaar 内部实现剖析:Linux 下 Logitech HID++ 设备管理的三层架构

开发工具 【免费下载链接】Solaar Linux device manager for Logitech devices 项目地址: https://gitcode.com/gh_mirrors/so/Solaar 点击查看 免费下载 本文依据仓库内 docs/implementation.md 的系统架构文档,结合 lib/logitech_receiver、lib/hidap… · 2026/9/25 7:50:33

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码