android推送,androidpn项目分析及完善学习笔记(三) XMPP协议
来源:互联网 发布:win10rar解压软件推荐 编辑:程序博客网 时间:2024/04/29 04:02
简介
XMPP全称为可扩展通讯和表示协议,是一种基于标准通用标记语言的子集XML的协议,它继承了在XML环境中灵活的发展性。因此,基于XMPP的应用具有超强的可扩展性。经过扩展以后的XMPP可以通过发送扩展的信息来处理用户的需求,以及在XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且,XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开发者更容易建立客户应用程序或给一个配好系统添加功能。
网络结构
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。
格式
言归正传,经过上面的介绍,我们大概了解XMPP协议的定义,但是如何使用XMPP呢,首先我们要从格式说起。
XMPP常用标签如下:
<stream:stream>...<presence><show/></presence><message to='foo'><body/></message><iq to='bar'><query/></iq>...</stream:stream>XMPP规定每一个客户端是使用JID(Jabber Identifier,Jabber标识符)来作为身份标识的:
[usr"@"]domain["/"resource]比如
jack@gmail.com下面一一解释标签含义。
stream
客户端:
<stream:stream to="example.com" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0">服务器端:
<stream:stream from="example.com" id="someid" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/stream" version="1.0">客户端和服务器端最后都是以</stream:stream>结尾,<stream:stream>与</stream:stream>还有其它标签,我们下面都会一一讲解。
客户端中to表示消息的接收方,服务器端的from标识发送方的名字或标识,id在stream流节点中用于表示流的身份唯一性。xmlns,xmlns:stream是一些固定的命名空间,是不能变的。version的值最低为1.0,这是TLS协商,SASL协商,流特性,流错误等受支持的最低版本。
presence
presence标签表示用户在线状态
<presence from="jackson@gmail.com" to="jimmy@msn.com" type="unavailable"/>from:消息发送方
to:消息接收方
type:在线状态,有如下几个选项可以选择。
- available:上线(默认,不指定type属性时则默认为available)
- unavailable:下线
- subscribe:订阅某个用户的在线状态
- subscribed:授权该订阅
- unsubscribe:取消订阅某个用户在线状态
- unsubscribed:取消授权订阅
- error:错误
<presence from="<span style="text-indent: 28px; font-family: Arial, SimSun;">jackson@gmail.com" </span><span style="text-indent: 28px; font-family: Arial, SimSun;">to="jimmy@msn.com"</span><span style="text-indent: 28px; font-family: Arial, SimSun;">></span> <show>away</show> <status>Having a spot of tea</status> <priority>1</priority></presence>
show:表示在线状态的总体类别,可以有以下参数:
- chat:当前在线并愿意与别人聊天
- away:鼠标一段时间没有操作或者用户设置为离开状态
- xa:长时间离开
- dnd:不想被别人打扰(Do Not Disturb)
priority:一个位于-128到127之间的值,定义消息路由到用户的优先顺序。如果值为负,用户的消息将被扣留。
message
message用于传输聊天内容。
<message from="jackson@gmail.com" to="jimmy@msn.com" type="chat"> <body>Hello!</body></message>from:消息发送方
to:消息接收方
type:会话类型,有如下几种参数可以选择:
- normal:一条独立消息,不属于任何一个会话(默认)
- chat:一对一会话
- groupchat:群聊会话
- headline:用于在客户端上显示的头条内容
- error:发生错误
iq
iq代表信息查询(info query),是一种“请求-响应”机制,与http类似。IQ使一个实例能够向另一个实体发起请求,请求/响应报文以id属性标示。IQ交互通常以get/result和set/result模式执行。
<iq from="jackson@gmail.com" id="rr82a1z7" to="jackson@gmail.com" type="get"> <query xmlns="jabber:iq:roster"/></iq>from:消息的发送方
to:消息的接收方
type:类似于http中的请求响应方式,有如下几种
- get
- set
- result
- error
获得当前联系人
1.客户端向服务器发起查询请求
<iq from="juliet@example.com/balcony" <strong><u>type="get"</u></strong> id="roster_1"> <query xmlns="jabber:iq:roster"></query> </iq2.服务器返回列表
<iq to="juliet@example.com/balcony" <strong><u>type="result"</u></strong> id="roster_1"> <query xmlns="jabber:iq:roster"> <item jid="romeo@example.net" name="Romeo" subscription="both"> <group>Friends</group> </item> <item jid="mercutio@example.org" name="Mercutio" subscription="from"> <group>Friends</group> </item> <item jid="benvolio@example.org" name="Benvolio" subscription="both"> <group>Friends</group> </item> </query> </iq>
增加联系人
<iq from="juliet@example.com/balcony" <strong><u>type="set"</u></strong> id="roster_2"> <query xmlns="jabber:iq:roster"> <item jid="nurse@example.com" name="Nurse"> <group>Servants</group> </item> </query> </iq>服务器收到请求后,首先更新本地存储资料,然后向关联实体发出<iq>设置命令,使所有实体处于同步状态
更新联系人
<iq from="juliet@example.com/chamber" <strong><u>type="set</u></strong>" id="roster_3"> <query xmlns="jabber:iq:roster"> <item jid="romeo@example.net" name="Romeo" <strong><u>subscription="both"</u></strong>> <group>Friends</group> <group>Lovers</group> </item> </query> </iq>删除联系人
<iq from="juliet@example.com/balcony" <u><strong>type="set"</strong></u> id="roster_4"> <query xmlns="jabber:iq:roster"> <item jid="nurse@example.com" <u><strong>subscription="remove"</strong></u>/> </query> </iq>
subscription表示用户和contact之间的一个关系
更多操作(比如关注联系人等)见http://www.cnblogs.com/icpp/articles/2060928.html说明注意:get时的id与result时的id要保持一致!!!
到此,我们的xmpp就已经介绍完了,下面一篇博客正式开始分析androidpn项目
- android推送,androidpn项目分析及完善学习笔记(三) XMPP协议
- android推送,androidpn项目分析及完善学习笔记(一) Socket
- android推送,androidpn项目分析及完善学习笔记(二) Mina
- 推送androidpn基于xmpp协议
- 学习Android推送功能笔记--XMPP协议
- Android消息推送(一)--AndroidPn(XMPP协议)Demo(包含tomacat)
- Android消息推送(一)--AndroidPn(XMPP协议)Demo版
- 基于xmpp协议的开源框架androidpn学习笔记
- XMPP协议学习笔记三
- android--笔记--XMPP协议消息推送原理
- Android消息推送(一)--AndroidPn(XMPP协议)Demo版到正式上线
- Android消息推送(一)--AndroidPn(XMPP协议)Demo版到正式上线
- Android消息推送(一)--AndroidPn(XMPP协议)Demo版到正式上线
- Android消息推送(一)--AndroidPn(XMPP协议)Demo版到正式上线
- 【转载】Android消息推送(一)--AndroidPn(XMPP协议)Demo版到正式上线
- xmpp/androidpn推送配置
- Android 推送之Androidpn项目分析(一)
- Android 推送之Androidpn项目分析(一)
- socket的overlapped(重叠) I\O和其他socket I\O模型的区别
- How to create a sysfs file node
- impala简单使用
- php $_SERVER['PHP_SELF'] $_SERVER['SCRIPT_NAME'] $_SERVER['REQUEST_URI']区别
- hdu 2222 keywords search
- android推送,androidpn项目分析及完善学习笔记(三) XMPP协议
- LeetCode_OJ【60】Permutation Sequence
- 关于view的事件分发机制(第一卷)
- 对象作为函数参数
- 通知传值
- springmvc请求接收参数的几种方法
- android单元测试
- wiki 数学公式
- String s=new String("abc")创建了几个对象