如何用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),仅供参考