XMPP协议相关基础概念(Strophe学习笔记)
相关资料:
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状态。
↓
断开连接
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名称。
裸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中,并在加载下一个页面时重新将其接入会话中。
XMPP协议相关基础概念(Strophe学习笔记)的更多相关文章
- (转载)小白的linux设备驱动归纳总结(一):内核的相关基础概念---学习总结
1. 学习总结 小白的博客讲的linux内核驱动这一块的东西比较基础,因此想通过学习他的博客,搭配着看书的方式来学习linux内核和驱动.我会依次更新在学习小白的博客的过程的感悟和体会. 2.1 内核 ...
- linux设备驱动归纳总结(一)内核的相关基础概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxx ...
- WiFi相关基础概念
转自:https://blog.csdn.net/lbaihao/article/details/73250798 一.WiFi相关基础概念 1.什么是wifi 我们看一下百度百科是如何定义的: Wi ...
- 【Linux开发】linux设备驱动归纳总结(一):内核的相关基础概念
linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- linux设备驱动归纳总结(二):模块的相关基础概念【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-59415.html linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10 ...
- 【Linux开发】linux设备驱动归纳总结(二):模块的相关基础概念
linux设备驱动归纳总结(二):模块的相关基础概念 系统平台:Ubuntu 10.04 开发平台:S3C2440开发板 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ...
- XMPP协议相关知识
XMPP协议的组成 主要的XMPP 协议范本及当今应用很广的XMPP 扩展: RFC 3920 XMPP:核心.定义了XMPP 协议框架下应用的网络架构,引入了XML Stream(XML 流)与XM ...
- 第1课_Java基础知识【学习笔记】
摘要:韦东山android视频学习笔记 一.android系统的基本框架如图一所示,应用程序是用java编写的,底层驱动是用C代码写的,java与C怎么连接在一起主要是通过本地服务.android系统 ...
- 《Python编程:从入门到实践》基础知识部分学习笔记整理
简介 此笔记为<Python编程:从入门到实践>中前 11 章的基础知识部分的学习笔记,不包含后面的项目部分. 书籍评价 从系统学习 Python 的角度,不推荐此书,个人更推荐使用< ...
随机推荐
- ImageSwitch图像切换控件
ImageSwitch图像切换控件 继承ViewAnimator所以可以做动画 继承ViewGroup所以可以装别的控件,所以ImageSwitch里面装的就是image,不过要找个ImageView ...
- 怎么用API网关构建微服务
选择将应用程序构建为微服务时,需要确定应用程序客户端如何与微服务交互.在单体应用程序中,只有一组端点.而在微服务架构中,每个微服务都会暴露一组通常是细粒度的端点.在本文中,我们将讨论一下这对客户端与应 ...
- 《RocketMQ 安装和使用》
安装Maven 安装步骤:<Maven的安装.配置及使用入门> http://www.cnblogs.com/dcba1112/archive/2011/05/01/2033805.htm ...
- C# WPF DataGrid 隔行变色及内容居中对齐
C# WPF DataGrid 隔行变色及内容居中对齐. dqzww NET学习0 先看效果: 前台XAML代码: <!--引入样式文件--> <Window.Resourc ...
- IIS7配置PHP简要说明
1. IIS7 安装的时候 要注意三个地方打得勾 万维网服务->应用程序开发功能->CGI ->ISAPI扩展 ->ISAPI筛选器 注: CGI 会在IIS7+PHP_ ...
- java中base64
// 将 s 进行 BASE64 编码 public static String getBASE64(String s) { if (s == null) return null; return (n ...
- 28 python 并发编程之多进程
一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...
- spring学习-4
bean的作用域 使用bean的scope属性来配置bean的作用域 scope="singleton":默认是单例模式即容器初始化创建bean实例,在整个容器的生命周期内只创建这 ...
- uva11134 - Fabled Rooks(问题分解,贪心法)
这道题非常好,不仅用到了把复杂问题分解为若干个熟悉的简单问题的方法,更是考察了对贪心法的理解和运用是否到位. 首先,如果直接在二维的棋盘上考虑怎么放不好弄,那么注意到x和y无关(因为两个车完全可以在同 ...
- 掌握sudo的使用
“sudo”是Unix/Linux平台上的一个非常有用的工具,它允许系统管理员分配给普通用户一些合理的“权利”,让他们执行一些只有超级用户或其他 特许用户才能完成的任务,比如:运行一些像mount,h ...