在讲XMPP和asmck之前 ,我还是先分享一些资源文档,如果你有耐心,可以直接忽略我下面所写的。下面有关XMPP的介绍大部分是摘抄网上的文档,后面我会写一些基于XMPP协议和asmck开源库的聊天室开发,功能包括,文本,语音,和当前地理位置地址。

XMPP官网:http://xmpp.org

Smack开发官方指导文档:http://www.igniterealtime.org/builds/smack/dailybuilds/documentation/extensions/index.html

Smack开发API文档:http://www.igniterealtime.org/builds/smack/dailybuilds/javadoc/

XMPP中文翻译计划:http://wiki.jabbercn.org/首页

一,什么是XMPP

XMPP(Extensible Messaging and Presence Protocol),可扩展消息与存储协议,是目前主流的IM协议之一,它是一种基于XML传输的协议,我们都知道XML的可扩展性比较强,XMPP使用XML进行传输,使得我们可以使用XMPP发送扩展的消息来满足我们更多的需求。

XMPP包含两部分的定义:一是核心的XML流传输协议,此定义使得XMPP能够在一个比以往网络通信协议更规范的平台上实现;二是基于
XML流传输的即时通讯扩展应用。

XMPP 中定义了三个角色:客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担 着与异构即时通信系统的互联互通,异构系统可以包括 SMS(短信),MSN,ICQ 等。基本的网络形式是单客户端通过 TCP/IP 连接到单服务器,然后在之上传输 XML。

XMPP 的基本网络结构如下:

C1----S1---S2---C3

|
C2----+--G1===FN1===FC1

符号表示:C1,C2,C3=XMPP 客户端;S1,S2=XMPP;服务端 G1=在 XMPP 和使用外部消息网络(非 XMPP)的协议之
间转换的网;FN1=外部消息网络;FC1=外部消息网络的客户端。

(1)服务器

服务系统是 XMPP 通信的智能提取层,它主要负责:管理来自其他个体的会话连接或者 XML 流(streams)和来自客户 端、服务器、其他个体的认证发送在 XML 流实体之中的适当的 XML 地址节点。大多数 XMPP 服务都允许存储一些客户端 数据(比如联系人列表),在这种情况下,服务直接面向这个客户端处理 XML 数据,而不是其他个体。

(2)客户端

大多数客户端是通过 TCP 直接连接,并且使用 XMPP 获得服务器提供全部-12-第 2 章 Jabber 协议原理及其应用功能和其
他服务。许多资源通过认证的客户端也许同时连接到服务器,定义在 XMPP 地址的每个资源是不同的(比如
<node@domain/home>和<node@domain/work>)建议服务器和客户端采用的端中是 5222。

(3)网关

它的主要功能是将 XMPP 协议转换成外部消息(non-XMPP)系统使用的协议,也将返回的数据转换成 XMPP。这些通信是基
于网关和服务器,基于网关和外部消息系统之间的。

XMPP 消息格式

Jabber/XMPP 系统使用 XML 流在不同实体之间相互传输数据。在两个实体的连接期间,XML 流将从一个实体传送到另一个实体。在实体间,有三个顶层的 XML 元素:

<message/>,<presence/>和<iq/>。每一个都包含属性和子节
点。下面将分别描述这些元素。

1.消息(message)元素:

一个即时消息系统最基本的功能就是能够在两个用户之间实时交换消息,<message/>元素就提供了这个功能。每条消息
都有一个或多个属性和子元素。属性“from”和“to”分别表示了消息发送者和接收者的地址。<message/>也可以包含
一个“type”属性,这给接收者一个提示,这个消息是什么样的消息。表 3-1 给出了“type”属性的可能取
值。<message/>中也可以包含“id”属性,用来唯一的标识一个输出消息的响应。

2. 状态(presence)元素:

<presence/>元素用来传递一个用户的存在状态的感知信息。用户可以是“available”,要么
是“unavailable”,“Hide”等。当用户连接到即时消息服务器后,好友发给他的消息就立即被传递。如果用户没有连
接到服务器,好友发给他的消息将被服务器存储起来直到用户连接到服务器。用户通过即时消息客户端自己控制可用性。
但是,如果用户断开了同服务器的连接,服务器将发送给订阅了这个用户的存在信息的用户通知他们用户已经不可
用。<presence/>还包含了两个子元素:<show/>和<status/>。<status>包含了一个对<show/>的文本描述。

3. IQ(Info<Query)元素
        IQ 元素是 Jabber/XMPP 消息协议的第三个顶层元素。IQ 代表"Info/Query",用来发送和获取实体之间的信息。IQ 消息
是通过“请求/响应”机制在实体间进行交换的。IQ 元素用于不同的目的,它们之间通过不同的命名空间来加以区分。在
Jabber/XMPP 消息协议里有许多的命名空间,但最常用的命名空间
是:"jabber:iq:register","jabber:iq:auth","jabber:iq:roster"。

上面描述了 Jabber 协议的三个顶层节点。通过这种格式 Jabber 消息不仅可以是简单的文本(text),而且可以携带
复杂的数据和各种格式的文件,也就是说 Jabber 不仅可以用在人与人之间的交流,而且可以实现软件与软件或软件与人
之间的交流。Jabber 的这种功能大大扩展了即时通信的应用范围。
XMPP 工作机制

例如:一个终端名字是 Remeo,通过服务器 montague.lit 与其他的用户相连,其他的用户
通过服务器 juliet@capulet.lit 建立连接。

第一步 Romeo 开始通过发送一个 stream 包与服务器 montague.lit 取得联系,这一步包含了鉴权,登录等等。

第二步 Romeo 获取了他的联系人列表,通过向服务器 montague.lit 发送<iq/>字段请求,按照下面的协议。

<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 文本连缀在一起,从<stream>到</stream>构成了一个完整
的 XML 文档。其中的 stream 标签就是所谓的 XML Stream。在<stream>与</stream>中间的那些
<message>...</message>这样的 XML 元素就是所谓的 XML Stanza(XML 节)。XMPP 核心协议通信的基本模式就是
先建立一个 stream,然后协商一堆安全之类的东西,中间通信过程就是客户端发送 XML Stanza,一个接一个的。服务器
根据客户端发送的信息以及程序的逻辑,发送 XML Stanza 给客户端。但是这个过程并不是一问一答的,任何时候都有可
能从一个方发信给另外一方。通信的最后阶段是</stream>关闭流,关闭 TCP/IP 连接。

二,什么是asmack

asmack其实是Smack在Android平台上的一个实现版本,Smack 是一个实现了XMPP协议的开源API库,

asmack github源码地址:https://github.com/Flowdalic/asmack

由于公司项目需要,我在asmack官方版本的基础上,修改了部分源码,使得其可以很快速的投入项目使用。

修改后的源码地址:https://github.com/UFreedom/asmack-android-8-source-4.0.2

这个源码可以直接下载,然后导入项目中使用

Android即时通讯开发之XMPP (一)初识XMPP协议和asmack的更多相关文章

  1. Android 即时通讯开发小结(一)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...

  2. Android Studio快速开发之道

    概述 现如今开发越来越追求效率和节奏,节省出时间做更多的事情,除了开发技术上的封装等,开发工具的使用技巧也是很重要的,今天就根据自己的经验来给大家介绍一下Android Studio快速开发之道. P ...

  3. Android插件化开发之OpenAtlas生成插件信息列表

    上一篇文章.[Android插件化开发之Atlas初体验]( http://blog.csdn.net/sbsujjbcy/article/details/47446733),简单的介绍了使用Atla ...

  4. Android 即时通讯开发小结(二)

    <Android 即时通讯开发小结>基于IM Andriod 开发的各种常见问题,结合网易云信即时通讯技术的实践,对IM 开发做一个全面的总结. 相关推荐阅读:. Android 即时通讯 ...

  5. (Android 即时通讯) [悬赏],无论是谁发现一个漏洞奖励人民币1000元!

    悬赏,无论是谁发现一个漏洞奖励人民币1000元!   3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通!  适用于: ...

  6. (Android 即时通讯) [悬赏],不管是谁发现一个漏洞奖励人民币1000元!

    悬赏,不管是谁发现一个漏洞奖励人民币1000元! 3Q Android 手机版即时通讯系统正式推出,可与电脑版 地灵(http://im.yunxunmi.com) 即时通讯系统互通!  适用于:小米 ...

  7. 项目源码--Android即时通讯IM客户端

    下载源码   技术要点: 1.完整精美客户端UI设计 2.自定义控件的灵活使用 3.UI控件的详细使用 4.即时通讯IM协议的实现 5.完整即时通讯IM客户端实现 6.源码详细的中文注释 …….   ...

  8. Android控件开发之Gallery3D效果

    package xiaosi.GalleryFlow; import android.app.Activity; import android.os.Bundle; public class Gall ...

  9. Android控件开发之Chronometer(转)

    (转自:http://blog.csdn.net/sun6255028/article/details/6688349) Chronometr是一个简单的定时器,你可以给它一个开始时间,并以此定时,或 ...

随机推荐

  1. 解决chrome没有允许添加flash的问题

    有时候测试的时候,需要开启flash 但是Chrome一般都是自己弹出来的 现在弹不出来怎么办 自己添加? chrome://settings/content/flash 对不起  根本没有的 怎么解 ...

  2. 如何在Marketing Cloud里创建extension field扩展字段

    首先在Marketing Cloud里找到创建扩展字段的tile入口,搜索关键字extension: 这会进入Fiori应用"Custom fields",能看到系统里所有创建好的 ...

  3. 切记:永远不要在MySQL中使用UTF-8

    MySQL使用UTF-8 issue 问题描述:最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误: Incorrec ...

  4. python基础:数据类型一

    一.可变不可变类型 二.数字类型 三.字符串类型 四.列表类型 一.可变不可变类型 #可变类型: 值变了,但是id没有变,证明没有生成新的值而是在改变原值,原值是可变类型 #不可变类型:值变了,id也 ...

  5. miguowangluozhan

    加紧备战 美国欲将全球拖入网络战争 人民日报 06-1405:01 去年,美国国防部发布的网络空间战略强调了“前沿防御(Defense forward)”理念.这被外界解读为美国军方将在他国而非美国本 ...

  6. okhttp缓存策略源码分析:put&get方法

    对于OkHttp的缓存策略其实就是在下一次请求的时候能节省更加的时间,从而可以更快的展示出数据,那在Okhttp如何使用缓存呢?其实很简单,如下: 配置一个Cache既可,其中接收两个参数:一个是缓存 ...

  7. python 单例与数据库连接池 及相关选择

    单例:专业用来处理连接多的问题(比如连接redis,zookeeper等),全局只有一个对象 单例代码 def singleton(cls): instances = {} def _singleto ...

  8. es高级用法之冷热分离

    背景 用户需求:近期数据查询速度快,较远历史数据运行查询速度慢? 对于开发人员而言即数据的冷热分离,实现此功能有2个前提条件: 硬件:处理速度不同的硬件,最起码有读写速度不同的硬盘,如SSD.机械硬盘 ...

  9. 理解Event冒泡模型

    本文探索一下Event的冒泡过程和初学遇到的几个小bug DOM Event概述 Event接口是检测在DOM中的发生的所有事件,我们一直在用,而且从DOM的很早的版本就一直在用着.早期的网景(后来的 ...

  10. Codeforces Round #455 (Div. 2) D题(花了一个早自习补了昨晚的一道模拟QAQ)

    D. Colorful Points You are given a set of points on a straight line. Each point has a color assigned ...