本文是根据xmpp协议视频教程的学习笔记。服务器
每个客户端使用JID(jabber identifier)来做为身份标识 ,格式为[user"@"]domain["/"resource],其中dom
domain:服务器域名; user:用户名; resource:属于用户的位置或设备,好比是手机仍是电脑
一个用户能够同时以多种资源与统一个XMPP服务器链接,完整的JID例子:zhangsan@gmail.com/iphone6s
stanza的通用属性:from,to,type,id(from属性与to属性遵循JID的格式)
from:标识消息的发送方,可是考虑到会出现伪造客户端消息来源,服务器通常不会直接采用from的数据来确认数据是由谁发的,而是更具链接状态作校验。
to:指定消息的所要发送的对象,若是没有给出to属性,则服务器认为该消息是发送给本身的,而不会转发给其余的用户。
type:指定一段stanza的类型
id:stanza的惟一性标识,当客户端向服务端发送消息后,服务端向客户端作出响应,此处的id用于表示服务端是不是针对以前给此服务端发送消息的客户端的作惟一性标识。客服端在给服务端发消息的时候会在消息中加上该id。服务端在向客户端回复消息的时候回在消息中加上一样的id。
stream标签
client经过向server发送下面一段stanza来请求创建链接(注意没有结束标签)iphone
<stream:stream to="example.com" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" >
当服务端收到客服端发来的消息后,经过回复下面一段stanza来创建链接(没有结束标签)ide
<stream:stream from="example.com" to="clientId" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" >
上面的id有服务器端随机生成,在以后将其做为客户端与服务端链接的惟一id,当经历这次交互以后,客户端与服务端就成功创建链接,才会认为客户端与服务端都是支持xmpp协议,才能进行进一步的数据通讯。注意,客户端与服务端之间没有发送的stanza只有开始标签而没有结束标签,其含义是表示一直处于链接状态,若是要想断开链接,只须要向对方发送结束标签</stream:stream>便可。post
presence 标签用于标识当前的用户在线状态,基本结构以下学习
<presence from="zhangsan@gmail.com" to="lisi@hotmail.com" type="unavailable" />
上面这段xml标签的意思是zhangsan@gmail.com告诉lisi@hotmail.com他已经下线了,presence种的type的可选参数available(在线)、unavailable(离线)、spa
subscribe(可订阅)、subscribed(已受权订阅)、unsubscribe(取消订阅)、unsubscribed(已受权取消订阅)、error(发送错误)。当客户端在线是,能够经过一些扩展标签丰富该在线状态,例如:code
<presence> <show>away</show> <status>外出就餐</status> </presence
show标签标示更加详细的在线状态,标示暂时离开,status则是最进一步说明。orm
show标签有如下可选参数:chat(在线且愿意和与别人聊天)、 away(短期不在)、 xa(长时间离开)、 dnd(请勿打扰)。视频
message标签用于传输具体内容,格式以下:
<message from="zhangan@gmail.com" to="lisi@hotmail.com" type="chat" > <body>周末一块儿去大保健吼不吼啊!</body> </message>
其中message中type属性的可选参数有:normal(独立消息。不属于任何一个会话)、chat(表示一对一的会话,两我的之间的会话)、groupchat(群聊,至关于QQ里的群或者讨论组的概念)、headline(头条)、error(出现错误)
iq(Information Query)标签结构以下:
<iq from="zhangsan@gmail.com" id="idididi" to="zhangsan@gmail.com" type="get"> <query xmlns="jabber:iq:roster"/> </iq>
其中from与to指定同一个JID.query标签中的roster是指联系人列表的意思。type可选的值有:get(获取数据,相似于http协议中的get请求)、set(设置数据,相似于http协议中的post请求)、result(用于相应数据)、error(发生错误)
上面的一段iq的stanza表示用户zhangsan@gmail.com向服务器发起了查询本身的联系人的请求其响应的结果可能以下:
<iq from="zhangsan@gmail.com" id="idididi" to="zhangsan@gmail.com" type="result"> <query xmlns="jabber:iq:roster"> <item jid="zhangsan@gmail.com"/> <item jid="lisi@hotmail.com"/> <item jid="wangwu@foxmail.com"/> <item jid="haha@163.com"/> </query> </iq>
注意iq标中的id在发送get请求和返回result时必须保持一致。iq标签不单单用于查询请求,还能够用户注册、登陆、通知等
完整的stanza以下
<!--一个完整的 xml stanza --> <stream:stream><!--stream 用于创建初始化链接 --> <presence><!--presence 标签用于标识当前的用户状态 --> <show/> </presence> <message to=”foo”> <body/> </message> <iq to="bar"> <query /> </iq> ... </stream:stream>