XMPP协议相关基础概念(Strophe学习笔记)

 相关资料:html

XMPP官网http://xmpp.org/xmpp-software/libraries/
nginx的转发配置http://mineral.iteye.com/blog/448260
XMPP的xml格式http://seong.iteye.com/blog/1871338
IBM关于XMPP的讲解https://www.ibm.com/developerworks/cn/xml/tutorials/x-realtimeXMPPtut/

 

1. XMPP
  eXtensible Messaging and Presence Protocol 可扩展消息处理和现场协议,用于在2个地点之间传递小型的结构化数据段的协议。定义了在两个或更多痛心尸体之间传递数据所采用的格式。
2. XMPP服务器
  为XMPP节提供路由。
3. 应用
  在XMPP内部,能够找到由联系人组成的花名册,能够用它们来建立定向或无向社交图。
  当联系人上下线时自动发送出席通知,而我的消息和公共消息时XMLPP系统的基础应用。
  有时候开发人选选择XMPP做为底层技术。
4. XMPP内部功能块
  构建发布-订阅服务、多人聊天、表单检索和处理、实时数据传输、隐私控制、远程过程调用。
5. XMPP节
  XMPP通讯的端点以节为单位来处理输入和产生输出。
  首先有个XMPP流,而后全部工做都是在这个流上发送和接收XMPP节实现的。
  XMPP流有2份XML文档组成,通讯的每一个方向均有1份。这些文档的根节点是<stream:stream>。这个stream节点的子节点由“可陆游的节以及流相关的顶级节点”构成。每一个节都是一个XML元素(包括它的子节点)。
  XMPP节有3种:<presence>、<message>、<iq>。
6. 链接的lifecyle
  链接
  ↓
  创建流
  ↓
  身份验证: 当一个链接首次创建时,Strophe会在后台发送并接受几个XMPP节以处理身份验证和会话创建工做。只有当会话成功启动时才会得到CONNECTED状态。
  ↓
  断开链接nginx

7. BOSH
  Web浏览器自身并不能理解XMPP协议(至少目前不会),所以XMPP链接必须经过HTTP请求创建隧道。这种隧道技术的一个反作用就是要把XMPP节放入到<body>包装器中,该包装器包含了一些有关请求的原数据。这种隧道技术(名为BOSH)正式文档XEP-0124和XEP-0206的主题。show_traffic()函数忽略这个<body>包装器而处理它的子元素,也就是XMPP节自己。
8. 序列化
  XML转化为文本。Strophe.serialize()方法。
9. JID
  即XMPP网络上的每一个尸体的1个或多个地址。每一个JID有三部分组成:节点、域、资源。域是必须的,节点和资源是可选的,取决于具体环境。
  域:实体(服务器、组件或插件)的可解析DNS名称。apache

  裸JID elizabeth@longboutn.lit (无资源部分)
  完整JID elizabeth@longboutn.lit/library跨域

10. 获取JID的方法(connection的jid属性包含着与该链接相关的完整JID)
  Strophe.getUserFromJid("darcy@pemberley.lit/library");//darcy
  Strophe.getDomainFromJid("darcy@pemberley.lit/library");//pemberley.lit
  Strophe.getResourceFromJid("darcy@pemberley.lit/library");//library
  Strophe.getBareJidFromJid("darcy@pemberley.lit/library");//darcy@pemberley.lit
11. 几个日志函数Strophe
  Strophe中的每一个链接都有一个特殊的函数来钩入正在发送和接受的协议数据。
  1) xmlInput() xmlOutput() 用于格式化XMPP流的xml格式
  2) rawInput() rawOutput() 用于实际的字符数据
12. IQ
  1)每一个IQ-get或IQ-set节都必须接受到相应的IQ-result或IQ-error节(就像是HTTP协议任何GET或POST请求都必须接受到一个响应)。
  2)全部<iq>节必须携带一个id属性,用于在会话中惟一识别传入的响应,即特定节的IQ-result或IQ-error所对应的IQ-get或IQ-set节。
  3)必须为每次发送IQ-get或IQ-set节设置XMPP处理程序来处理成功或错误响应。
  4)调用函数为Connection.sendIQ(iq_stanza, success_callback, error_callback);后面两个参数是可选的。
13. 打招呼
  应用程序须要向服务器发送一个XMPP节向其打招呼,咱们经过Strophe的构造器来完成这件工做。hello节十个一包含ping请求的IQ-get节。
14. addHandler
  addHandler: function(handler, ns, name, type, id, from){
    //实现方法
  }
  1)只有顶级节点会检查后四个参数
  2)ns用于检查顶级节点以及它的直接子节点,一般只针对IQ节。IQ节一般包含一个子节点,这个自节点的namespace是根据它的服务类型肯定的。
  举例:conn.addHandler(myHandler, "urn:xmpp:ping", "iq”);// 每当connection接受到一个位于urn:xmpp:ping命名空间下的子节点IQ节时,都会调用myHander()函数。
15. chat states(http://xmpp.org/extensions/xep-0085.html)浏览器

16. nginx转发配制服务器

  若是是多台服务器的话,js存在跨域问题,因此得用代理来做转发,我用的是nginx,也能够apache。
17. 会话技术
  BOSH链接管理器用于相应HTTP请求,并利用它们为用户管理XMPP链接。除了XMPP通讯所需的套接字外,每一个托管链接均有2个与之相关的数据:SID和RID。
    SID:会话标识符(Session Identifier).一般是一个较长的、无心义的、由字母和数字组成的字符串。
    RID:请求标识符(Request Identifier).表示与BOSH托管链接相关联的HTTP协议请求。在链接创建以前,客户端在它的第一个请求中向链接管理器发送一个随机的RID。每一个后续的请求都会将这个RID的值递增1。
  这两个标识符用于惟必定位和使用托管的XMPP会话,即,若是一个应用程序知道SID和RID,那么它就可以接管或接入底层的会话。咱们须要作的就是使用未经修改的SID和递增1以后的RID向BOSH链接管理器发送一个请求。
  接入会话使用的函数:
  var connection = new Strophe.Connection(BOSH_URL);
  connection.attach(jid, sid, rid, callback);
18. 持久化连接
  实现会话的持久化就是吧SID和RID存储到cookie中,并在加载下一个页面时从新将其接入会话中。cookie

相关文章
相关标签/搜索