公告

微信

欢迎大家私信交流

Skip to content

xmpp群聊实现细节

协议

Multi-User Chat,MUC 协议

概念

  1. 房间
  2. 配置
  3. 成员
  4. 角色
  5. 房间历史
  6. 订阅房间
  7. 加入房间
  8. 邀请加入

流程

  1. 选择muc服务 - Ejabberd服务器
  2. 创建群聊房间
  3. 配置房间属性
  4. 邀请用户加入
  5. 用户加入房间/用户订阅房间
  6. 发送消息
  7. 接收消息
  8. 取消订阅房间&离开房间
  9. 销毁房间

其他

xmpp常用的标签有哪些?

XMPP (eXtensible Messaging and Presence Protocol) 是一种基于XML的开放式通信协议,常用于即时通讯系统。以下是XMPP中常用的一些标签:

  1. <message> - 用于发送消息
  2. <presence> - 用于发送在线状态信息
  3. <iq> (Info/Query) - 用于信息请求和响应
  4. <stream> - 定义XMPP会话开始和结束
  5. <body> - 消息正文
  6. <subject> - 消息主题
  7. <thread> - 消息线程标识
  8. <show> - 显示具体的在线状态(如"away","dnd"等)
  9. <status> - 描述状态的文本
  10. <priority> - 设置连接优先级
  11. <error> - 表示错误信息
  12. <query> - 用于查询操作,通常与<iq>一起使用
  13. <item> - 表示列表中的项目
  14. <x> - 用于扩展功能
  15. <presence> - 存在状态信息
  16. <roster> - 联系人列表

这些标签可以根据不同的XMPP扩展协议(XEP)有所扩展,XMPP的可扩展性是其主要特点之一。

核心通信通过XML节(Stanza)实现。

标签中的xmlns是什么?

在XMPP标签中,xmlns是"XML namespace"的缩写,它定义了XML元素的命名空间。命名空间是一种解决XML元素名称冲突的机制,特别是当不同的XML文档或协议需要集成时。

xmlns属性的主要作用和特点:

  1. 标识协议或扩展 - 它指定元素属于哪个协议或扩展。例如:xmlns="jabber:client"表示这是XMPP客户端命名空间。

  2. 避免名称冲突 - 当集成多个XML词汇表时,命名空间防止同名但含义不同的元素产生冲突。

  3. 指定XEP扩展 - XMPP允许通过XEP(XMPP Extension Protocol)进行扩展,每个XEP通常有自己的命名空间。

XMPP中常见的命名空间示例:

xml
<iq xmlns="jabber:client">
    <query xmlns="jabber:iq:roster">
        <!-- 这里是花名册查询相关内容 -->
    </query>
</iq>

在上面的例子中:

  • xmlns="jabber:client"表示这是XMPP客户端协议的范围
  • xmlns="jabber:iq:roster"表示query元素使用的是花名册(roster)扩展的命名空间

其他常见的XMPP命名空间包括:

  • jabber:server - 服务器间通信
  • jabber:iq:auth - 认证机制
  • jabber:iq:register - 用户注册
  • jabber:x:data - 数据表单
  • http://jabber.org/protocol/muc - 多用户聊天

命名空间使XMPP能够保持灵活性和可扩展性,同时确保不同功能模块之间的兼容性。

XMPP扩展协议(XEP) 是什么?

XMPP扩展协议(XEP, XMPP Extension Protocol)是对XMPP核心协议的扩展规范,用于增强和扩展XMPP的功能。XEP是XMPP标准基础的重要组成部分,由XMPP标准基金会(XSF)管理和维护。

XEP的主要特点和作用:

  1. 标准化扩展功能:XEP提供了标准化的方式来扩展XMPP的核心功能,确保不同实现之间的互操作性。

  2. 编号系统:每个XEP都有一个唯一的编号,如XEP-0045代表多用户聊天(MUC),XEP-0060代表发布-订阅(PubSub)。

  3. 状态流程:XEP文档有不同的状态,从实验性(Experimental)到草案(Draft),再到标准(Standard),反映了其成熟度和稳定性。

  4. 命名空间:每个XEP通常定义自己的XML命名空间,以区分不同扩展的XML元素。

  5. 向后兼容性:XEP系统允许协议随时间演进,同时保持向后兼容性。

一些重要的XEP示例:

  • XEP-0045: 多用户聊天(MUC),提供群聊功能
  • XEP-0054: vCard-temp,用户个人资料
  • XEP-0060: 发布-订阅,信息的发布与订阅机制
  • XEP-0080: 用户地理位置
  • XEP-0085: 聊天状态通知(正在输入等)
  • XEP-0115: 实体能力广告
  • XEP-0166: Jingle,用于多媒体会话
  • XEP-0198: 流管理,提高连接可靠性
  • XEP-0280: 消息碳复制,在多设备间同步消息
  • XEP-0363: HTTP文件上传

XEP的开发过程是开放的,任何人都可以提交新的XEP提案,经过XMPP社区的审查和讨论后,可能会被接受并发布。这种开放的标准化过程使XMPP能够不断适应新的需求和技术发展。

XEP文档通常包括协议描述、XML模式定义、使用示例和安全考虑等内容,为开发者提供了详细的实现指南。

加入房间和订阅房间的区别

一个在房间接收消息

一个不在房间也能接收消息

为房间设置白名单和密码

创建一个仅限规定成员加入的房间,当时用其他成员加入房间时,会返回错误,表示加入房间需要用户有房间成员权限

那么可以为其他用户添加成员权限

然后重新进入,此时用户可以收到正常进入房间的消息,并且可以正常收发消息

群聊消息的已读未读

xep-0333协议,需要发送带有markable标签的消息。由于message_id不一定具有唯一性,必须带上stanza-id标签来标识唯一消息

以displayed标签进行响应,display的标签为stanza-id标签中的id

Lambda接收到消息格式

Ejabberd接收到消息格式

数据库存储的消息格式

如何生成stanza-id

服务器生成的stanza-id独一无二

发送消息时,添加origin-id标签

服务器会自动根据origin-id中的id生成并添加stanza-id标签

xmpp服务器提供支持

  1. 转发用户发送给房间的消息
  2. 更新房间消息的已读未读
  3. 转发用户出席离席消息

上次更新于: