Android:Xmpp协议的简单分析
概要
在IETF中,把IM协议分为四种协议:
1.IMPP(InstantMessagingAndPresenceProtocol)
2.PRIM(PresenceAndInstantMessagingProtocol)不再使用
3.SIMPLE(SessionInitiationProtocolforInstantMessagingandPresenceLeveragingExtensions)
4.XMPP(ExtensibleMessagingandPresenceProtocol)
Xmpp(ExtensibleMessagingandPresenceProtocol)是基于可扩展标记语言(XML)的协议,用于即时消息(IM)
一个实体在Xmpp网络结构中被称为节点,它拥有唯一的标识符jabberidentifier(JID),即实体地址,用来表示一个Jabber用户,也可以表示其他内容,例如一个聊天室。
一个有效的JID包括一系列元素:
(1)域名(domainidentifier);
(2)节点(nodeindentifier);
(3)源(resourceindentifier)。
格式:node@domain/resource或node@domain类似于电子邮件的地址格式。
XMPP消息格式
客户端和服务器端的交互要经由XML流,XMPP中定义了3个顶层元素:
消息(Message)元素,状态(Presence)元素,IQ(Info/Query)元素
1.消息(Message)元素
用于在两个Jabber用户之间发送消息,JSM(Jabber会话管理器)负责满足所有的消息,不管目标用户的状态如何,如果用户在线JSM立即提交,否则JSM就存储
To:标识消息的接收方
From:发送方的名字或者标识
Body:包含要提交给目标用户的信息
Type:消息类型
结构:
<MessageTo='alex@jabber.org/contact'Type='chat'><Body>helloalex</Body></Message>
2.状态(Presence)元素
用来表明用户的状态,如:online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态的时候,就会在stream的上下文中插入一个Presence元素,来表明自身的状态。
结构:
<PresenceFrom='alex@jabber.org/contact'To='wan@jabber.org/contact'<Status>online<Status></Presence>
3.IQ(Info/Query)元素
IQ是一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应。如:Clinet在Stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个节点,里面是请求的结果。
IQ主要属性是Type,包括:Get获取当前域值,Set设置或替换Get查询的值,Result说明成功响应了先前的查询,Error查询和响应中出现的错误
IQ元素用户不同的目的,它们之间通过不同的命名空间来加以区分。在Jabber/XMPP消息协议里有许多的命名空间。
常用的命名空间(namespace):“jabber:iq:register”,“jabber:iq:auth”,“jabber:iq:roster”
结构:
<IQFrom='alex@jabber.org/contact'id='123456'Type='Result'/>
XMPP工作机制
例如:一个用户user,通过服务器server与其他用户建立连接,
1.user开始通过发送一个<stream/>包与服务器server建立连接,包括用户鉴权,登录等。
2.user取得他的联系人列表,通过向服务器server发送<IQ/>字段请求,按照协议
<iqtype='get'from='user@server'><queryxmlns='jabber:iq:roster'/></iq>
返回报文
<iqquery='result'to='user@server'><queryxmlns='jabber:iq:roster'><itemjid='friend1@server’/><itemjid='friend2@server'/></query></iq>
3.user发送一个presence请求服务器server,server将这条信息广播到user的所有好友
<presencefrom='user@server'><presencefrom='user@server'to='friend1@server'><presencefrom='user@server'to='friend2@server'>
4.如果user的好友在线,会将presence返回给user,告知自己的状态
<presenceto='user@server'from='friend1@server'><presenceto='user@server'from='friend2@server'>
5.user与好友通信聊天
<messageform='user@server'type='chat'to='friend1@server'><body>helloboy</body></message><messageform='friend@server'type='chat'to='friend1@server'><body>hellogirl</body></message>
更多相关文章
- Android状态栏上添加按钮(程序部分)
- Android(安卓)语音通话模块介绍(一) 开源的SIP协议栈
- Android(安卓)Launcher3 禁止用户拖动图标创建文件夹,控制拖动图
- Android进阶之路 - 软键盘顶起解决方案
- Flutter开发中问题汇总贴(持续更新中)
- Android(安卓)activity exported属性理解
- android 设置状态栏颜色和字体颜色
- i.MX6 安装交叉编译器
- Android防止用户快速点击