XMPP 学习笔记二 OpenFire框架与与XMPP协议基础知识

来源:互联网 发布:html5数据报表css 编辑:程序博客网 时间:2024/05/16 07:37

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/
http://xmpp.org/rfcs/rfc6121.html

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就存储。

<message from="user1@jabber.org/contact" to= "user2@jabber.org/contact" type ="chat"><body>你好,在忙吗</body></message>

Presence

用户的状态,如:online、away、dnd(请勿打扰)等。当用户离线或改变自己的状态时,就会在stream的上下文中插入一个Presence元素,来表明自身的状态.

<presence from ="lily@jabber.com/contact" to = "user2@jabber.com/contact"><status>Online</status></presence>

元素可以取下面几种值:
Probe :用于向接受消息方法发送特殊的请求
subscribe:当接受方状态改变时,自动向发送方发送presence信息。

IQ

一种请求/响应机制,从一个实体从发送请求,另外一个实体接受请求,并进行响应.例如,client在stream的上下文中插入一个元素,向Server请求得到自己的好友列表,Server返回一个,里面是请求的结果.

主要的属性是type。包括:

  • Get :获取当前域值。
  • Set :设置或替换get查询的值。
  • Result :说明成功的响应了先前的查询。
  • Error: 查询和响应中出现的错误。
<iq from ="lily@jabber.com/contact" id="1364564666" Type="result">

XMPP 流传输协议

基于XML FreeEIM流传输的即时通讯扩展应用。

XMPP工作机制:

例如:一个终端名字是Remeo,通过服务器montague.lit与其他的用户相连,其他的用户通过服务器juliet@capulet.lit建立连接。
第一步Romeo开始通过发送一个stream包与服务器montague.lit取得联系,这一步包含了鉴权,登录等等。
第二步Romeo获取了他的联系人列表,通过向服务器montague.lit发送字段请求,按照下面的协议。

<iq type="get" from="romeo@montague.lit/pda"><query xmlns="jabber:iq:roster"/></iq><iq type="result" to="romeo@montague.lit/pda"><query xmlns="jabber:iq:roster"><item jid="juliet@capulet.lit"/><item jid="mercutio@shakespeare.lit“/><item jid="benvolio@shakespeare.lit" /></query></iq>

第三步Romeo发送了一个presence请求到服务器montague.lit,然后会将这个信息广播到他的所有好友。

<presence from="romeo@montague.lit/pda" /><presence from="romeo@montague.lit/pda" to="juliet@capulet.lit" /><presence from="romeo@montague.lit/pda" to="mercutio@shakespeare.lit" /><presence from="romeo@montague.lit/pda" to="benvolio@shakespeare.lit" />

第四步如果Romeo的联系人都在线,就会将presence回复给Romeo,告知自己的状态。

<presence to="romeo@montague.lit/pda" from="juliet@capulet.lit/balcony" /><presence to="romeo@montague.lit/pda" from="juliet@capulet.lit/chamber" /><presence to="romeo@montague.lit/pda" from="mercutio@shakespeare.lit/home" />

第五步Romeo和Juliet开始交换信息,进行聊天。

<message from="romeo@montague.lit/pda" to="juliet@capulet.lit" ><body>hi!</body></message><message from="juliet@capulet.lit/balcony" to="romeo@montague.lit/pda" > <body>hi yourself!</body></message>

以文档的观点来看,客户端或服务器发送的所有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

0 0
原创粉丝点击