xmpp群聊实现细节
协议
Multi-User Chat,MUC 协议
概念
- 房间
- 配置
- 成员
- 角色
- 房间历史
- 订阅房间
- 加入房间
- 邀请加入
流程
- 选择muc服务 - Ejabberd服务器
- 创建群聊房间
- 配置房间属性
- 邀请用户加入
- 用户加入房间/用户订阅房间
- 发送消息
- 接收消息
- 取消订阅房间&离开房间
- 销毁房间
其他
xmpp常用的标签有哪些?
XMPP (eXtensible Messaging and Presence Protocol) 是一种基于XML的开放式通信协议,常用于即时通讯系统。以下是XMPP中常用的一些标签:
<message>
- 用于发送消息<presence>
- 用于发送在线状态信息<iq>
(Info/Query) - 用于信息请求和响应<stream>
- 定义XMPP会话开始和结束<body>
- 消息正文<subject>
- 消息主题<thread>
- 消息线程标识<show>
- 显示具体的在线状态(如"away","dnd"等)<status>
- 描述状态的文本<priority>
- 设置连接优先级<error>
- 表示错误信息<query>
- 用于查询操作,通常与<iq>
一起使用<item>
- 表示列表中的项目<x>
- 用于扩展功能<presence>
- 存在状态信息<roster>
- 联系人列表
这些标签可以根据不同的XMPP扩展协议(XEP)有所扩展,XMPP的可扩展性是其主要特点之一。
核心通信通过XML节(Stanza)实现。
标签中的xmlns是什么?
在XMPP标签中,xmlns
是"XML namespace"的缩写,它定义了XML元素的命名空间。命名空间是一种解决XML元素名称冲突的机制,特别是当不同的XML文档或协议需要集成时。
xmlns
属性的主要作用和特点:
标识协议或扩展 - 它指定元素属于哪个协议或扩展。例如:
xmlns="jabber:client"
表示这是XMPP客户端命名空间。避免名称冲突 - 当集成多个XML词汇表时,命名空间防止同名但含义不同的元素产生冲突。
指定XEP扩展 - XMPP允许通过XEP(XMPP Extension Protocol)进行扩展,每个XEP通常有自己的命名空间。
XMPP中常见的命名空间示例:
<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的主要特点和作用:
标准化扩展功能:XEP提供了标准化的方式来扩展XMPP的核心功能,确保不同实现之间的互操作性。
编号系统:每个XEP都有一个唯一的编号,如XEP-0045代表多用户聊天(MUC),XEP-0060代表发布-订阅(PubSub)。
状态流程:XEP文档有不同的状态,从实验性(Experimental)到草案(Draft),再到标准(Standard),反映了其成熟度和稳定性。
命名空间:每个XEP通常定义自己的XML命名空间,以区分不同扩展的XML元素。
向后兼容性: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服务器提供支持
- 转发用户发送给房间的消息
- 更新房间消息的已读未读
- 转发用户出席离席消息