转自:http://blog.csdn.net/xundh/article/details/51867764
OpenFire框架
- Pubsub:Publish/Subscribe,这使得xmpp实体能够在pubsub服务上创建nodes(topics),并且发布信息。一个事件通知将广播到所有订阅了这个节点的实体上。
- Pep:(Personal EventingProtocol)使用XMPPpublish-subscribe协议广播状态改变事件、及时消息和出席帐户到其他用户。
- Stun:为p2p会话提供地址发现服务,如:媒体传输和UDP包的收发。
- Router:内部的路由,把相应的包路由给相应的处理器。
- Muc:(Multi-User Chat)用户可以交换文本信息在room或者channel上下文中,版主或者管理员有权踢除用户和禁止用户。
XMPP协议
参考:http://blog.163.com/guomaolin_gavin/blog/static/19961830720125261015351/
XMPP工作说明
client 的 jabber消息通过server转发
- client 连接到 server的证书认证
- server 利用本地目录系统
- client向server 查询目标状态
- server查找,连接、相互认证
- client交互
XMPP地址格式
JID 实体地址
一个实体在XMPP网络结构中被称为一个接点,它有唯一的标示符jabber identifier(JID),即实体地址,用来表示一个Jabber用户或一个聊天室.
一个有效的JID包括一系列元素:
- 域名(domain identifier);
用来表示接点不同的设备或位置,这个是可选的,如user1@serverl - 节点(node identifier);
- 源(resource identifier).
它的格式是node@domain/resource,node@domain,类似电子邮件的地址格式.
resource可以不用指定,但user1在登录到这个Server时,它的的JID可能是user1@serverl、exodus(如果a用Exodus软件登录),也可能是user1@serverl/psi(如果a用psi软件登录).资源只用来识别属于用户的位置或设备等,一个用户可以同时以多种资源与同一个XMPP服务器连接。
JID 格式:JID=[node”@”]domain[“/”resource]
XMPP消息格式
Message
两个jabber用户之间发送信息。Jsm(jabber会话管理器)负责满足所有的消息,不管目标用户的状态如何。如果用户在线jsm立即提交;否则jsm就存储。
- 1
- 2
- 3
- 1
- 2
- 3
Presence
用户的状态,如:online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.
- 1
- 2
- 3
- 1
- 2
- 3
元素可以取下面几种值:
Probe :用于向接受消息方法发送特殊的请求
subscribe:当接受方状态改变时,自动向发送方发送presence信息。
IQ
一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应.例如,client在stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果.
主要的属性是type。包括:
- Get :获取当前域值。
- Set :设置或替换get查询的值。
- Result :说明成功的响应了先前的查询。
- Error: 查询和响应中出现的错误。
- 1
- 1
XMPP 流传输协议
基于XML FreeEIM流传输的即时通讯扩展应用。
XMPP工作机制:
例如:一个终端名字是Remeo,通过服务器montague.lit与其他的用户相连,其他的用户通过服务器juliet@capulet.lit建立连接。
第一步Romeo开始通过发送一个stream包与服务器montague.lit取得联系,这一步包含了鉴权,登录等等。
第二步Romeo获取了他的联系人列表,通过向服务器montague.lit发送字段请求,按照下面的协议。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
第三步Romeo发送了一个presence请求到服务器montague.lit,然后会将这个信息广播到他的所有好友。
- 1
- 2
- 3
- 4
- 5
- 6
- 1
- 2
- 3
- 4
- 5
- 6
第四步如果Romeo的联系人都在线,就会将presence回复给Romeo,告知自己的状态。
- 1
- 2
- 3
- 1
- 2
- 3
第五步Romeo和Juliet开始交换信息,进行聊天。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 1
- 2
- 3
- 4
- 5
- 6
- 7
以文档的观点来看,客户端或服务器发送的所有XML文本连缀在一起,从到构成了一个完整的XML文档。
其中的stream标签就是所谓的XML Stream。
在与中间的那些…这样的XML元素就是所谓的XML Stanza(XML节)。
XMPP核心协议通信的基本模式就是先建立一个stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送XML Stanza,一个接一个的。服务器根据客户端发送的信息以及程序的逻辑,发送XML Stanza给客户端。但是这个过程并不是一问一答的,任何时候都有可能从一个方发信给另外一方。通信的最后阶段是关闭流,关闭TCP/IP连接。
参考:
http://blog.csdn.net/lsh6688/article/details/9209215
http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.html