XMPP协议的一些概念
XMPP地址
一个实体在XMPP网络结构中被称为一个节点,它有唯一的标示符jabber identifier(JID),即实体地址,用来表示一个用户,但是也可以表示其他内容,例如一个聊天室.一个有效的JID包括一系列元素:(1)域名 (domain identifier);(2)节点(node identifier);(3)源(resource identifier).它的格式是node@domain/resource,node@domain,类似电子邮件的地址格式.domain用来表示 接点不同的设备或位置,这个是可选的,例如a在Server1上注册了一个用户,用户名为doom,那么a的JID就是doom@serverl,在发送消息时,指明doom@serverl就可以了,resource可以不用指定。
XMPP的XML流
说白了就是在tcp协议上面分片断发送XML的流协议。也就是说,XMPP用TCP传的是XML流。
举个例子吧:
客户端:<?xml version='1.0'?>
<stream:stream to='example.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
服务器:<?xml version='1.0'?>
<stream:stream from='example.com' id='someid' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
客户端:<message from='juliet@example.com' to='romeo@example.net' xml:lang='en'>
客户端: <body>Art thou not Romeo, and a Montague?</body>
客户端:</message>
服务器:<message from='romeo@example.net' to='juliet@example.com' xml:lang='en'>
服务器:<body>Neither, fair saint, if either thee dislike.</body>
服务器:</message>
客户端:</stream:stream>
服务器:</stream:stream>
这与我之前的理解是相反的,原来客户端和服务器是通过一段一段的来发生的
其中<message>...< /message>这样的XML元素就是所谓的XML Stanza(XML节)。XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一个方发信给另外一方。通信的最后阶段是</stream>关闭 流,关闭TCP/IP连接。
XML节,XMPP定义了三种顶级XML节
<iq />
<message />
<presence />
XMPP给这三种节定义了五种通用属性
to
from
id
type
xml:lang
to属性指定接收节的JID。
from属性指定发送者的JID。
id属性是可选的。并且,在接收应用(通常是一个服务器)中是唯一的。注意:流ID可能是严格安全的,并且因此必须是即不能预测也不能重复的
type属性指定目的或消息上下文,出席或IQ节的详细信息。
iq节的type属性有:Error,Get,Result,Set; presence节的type属性有:Available,Subscribe,Subscribed,Unsubscribe,Unsubscribed,Unavailable,Probe,Error,Invisible; message节的type属性有:Chat,Error,GroupChat,Headline,Normal
xml:lang属性值指定任意可读XML字符数据的缺省语言
<message />节定义了消息语义,<message />节可被看作“推”机制,一个实体推信息给其它实体,与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收 者;根据接收到那样的一个节,服务器应该路由或传送它到有意的接收者。
<presence />节定义了出席语义,<presence />节可被看作基本广播或“发布-订阅”机制,多实体收到他们已订阅(在这种情况下,网络可利用信息)实体的信息。发布实体应该发送一个 不带‘to’属性的出席节,在这种情况下,与此实体相连的服务器应该广播给所有订阅实体。然而,一个发布实体也可能发送一个带有‘to’属性的出席节,此 种情况下,服务器应该路由或传送节到有意的接收者。
XMPP地址
一个实体在XMPP网络结构中被称为一个节点,它有唯一的标示符jabber identifier(JID),即实体地址,用来表示一个用户,但是也可以表示其他内容,例如一个聊天室.一个有效的JID包括一系列元素:(1)域名 (domain identifier);(2)节点(node identifier);(3)源(resource identifier).它的格式是node@domain/resource,node@domain,类似电子邮件的地址格式.domain用来表示 接点不同的设备或位置,这个是可选的,例如a在Server1上注册了一个用户,用户名为doom,那么a的JID就是doom@serverl,在发送消息时,指明doom@serverl就可以了,resource可以不用指定。
XMPP的XML流
说白了就是在tcp协议上面分片断发送XML的流协议。也就是说,XMPP用TCP传的是XML流。
举个例子吧:
客户端:<?xml version='1.0'?>
<stream:stream to='example.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
服务器:<?xml version='1.0'?>
<stream:stream from='example.com' id='someid' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' version='1.0'>
客户端:<message from='juliet@example.com' to='romeo@example.net' xml:lang='en'>
客户端: <body>Art thou not Romeo, and a Montague?</body>
客户端:</message>
服务器:<message from='romeo@example.net' to='juliet@example.com' xml:lang='en'>
服务器:<body>Neither, fair saint, if either thee dislike.</body>
服务器:</message>
客户端:</stream:stream>
服务器:</stream:stream>
这与我之前的理解是相反的,原来客户端和服务器是通过一段一段的来发生的
其中<message>...< /message>这样的XML元素就是所谓的XML Stanza(XML节)。XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一个方发信给另外一方。通信的最后阶段是</stream>关闭 流,关闭TCP/IP连接。
XML节,XMPP定义了三种顶级XML节
<iq />
<message />
<presence />
XMPP给这三种节定义了五种通用属性
to
from
id
type
xml:lang
to属性指定接收节的JID。
from属性指定发送者的JID。
id属性是可选的。并且,在接收应用(通常是一个服务器)中是唯一的。注意:流ID可能是严格安全的,并且因此必须是即不能预测也不能重复的
type属性指定目的或消息上下文,出席或IQ节的详细信息。
iq节的type属性有:Error,Get,Result,Set; presence节的type属性有:Available,Subscribe,Subscribed,Unsubscribe,Unsubscribed,Unavailable,Probe,Error,Invisible; message节的type属性有:Chat,Error,GroupChat,Headline,Normal
xml:lang属性值指定任意可读XML字符数据的缺省语言
<message />节定义了消息语义,<message />节可被看作“推”机制,一个实体推信息给其它实体,与EMAIL系统中发生的通信类似。所有消息节应该拥有‘to’属性,指定有意的消息接收 者;根据接收到那样的一个节,服务器应该路由或传送它到有意的接收者。
<presence />节定义了出席语义,<presence />节可被看作基本广播或“发布-订阅”机制,多实体收到他们已订阅(在这种情况下,网络可利用信息)实体的信息。发布实体应该发送一个 不带‘to’属性的出席节,在这种情况下,与此实体相连的服务器应该广播给所有订阅实体。然而,一个发布实体也可能发送一个带有‘to’属性的出席节,此 种情况下,服务器应该路由或传送节到有意的接收者。
<iq />节定义了请求语义,<iq />节可被看作一个请求-响应机制,与[HTTP]在某些方面相似。IQ语义让一个实体向其它实体请求或接收其它实体的响应成为可能。请求与响应的 数据内容由IQ无素的直接子元素的命名空间声明定义,并且,交互由请求实体通过使用‘id’属性来跟踪。因此,IQ交互遵从结构化数据交换的一个通用模式,此交换例如得到/结果或设置/结果(虽然如果合适的话,对一个请求的响应可能会以错误返回)。
以后待补充,结合mina来说明其应用