本文是根据xmpp协议视频教程的学习笔记。
每一个客户端使用JID(jabber identifier)来作为身份标识 ,格式为[user"@"]domain["/"resource],其中
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来请求建立连接(注意没有结束标签)
<stream:stream to="example.com" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams" version="1.0" >
当服务端收到客服端发来的消息后,通过回复下面一段stanza来建立连接(没有结束标签)
<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>即可。
presence 标签用于标识当前的用户在线状态,基本结构如下
<presence from="zhangsan@gmail.com" to="lisi@hotmail.com" type="unavailable" />
上面这段xml标签的意思是zhangsan@gmail.com告诉lisi@hotmail.com他已经下线了,presence种的type的可选参数available(在线)、unavailable(离线)、
subscribe(可订阅)、subscribed(已授权订阅)、unsubscribe(取消订阅)、unsubscribed(已授权取消订阅)、error(发送错误)。当客户端在线是,可以通过一些扩展标签丰富该在线状态,例如:
<presence> <show>away</show> <status>外出就餐</status> </presence
show标签标示更加详细的在线状态,标示暂时离开,status则是最进一步说明。
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>
来源:https://www.cnblogs.com/iwillow/p/4823915.html