新浪微博 有道云笔记 麦库 EverNote Pocket Instapaper 更多

XMPP 基础

XMPP 基础


技术博客http://www.cnblogs.com/ChenYilong/ 
新浪微博http://weibo.com/luohanchenyilong 


XMPP 基础 

即时通讯技术简介 
 即时通讯技术(IM)支持用户在线实时交谈。如果要发送一条信息,用户需 要打开一个小窗口,以便让用户及其朋友在其中输入信息并让交谈双方都看 到交谈的内容 
 有许多的IM系统,如AOL IMYahoo IM MSN以及QQ,它们最大的区别在于 各自通讯协议的实现,所以即时通讯技术的核心在于它的传输协议 
 协议用来说明信息在网络上如何传输,如果有了统一的传输协议,那么应当 可以实现各个IM之间的直接通讯,为了创建即时通讯的统一标准,目前已经 出现过的IM协议包括:IETF的对话初始协议(SIP)和即时通讯对话初始协议 和表示扩展协议(SIMPLE)、应用交换协议(APEX)、显示和即时通讯协议 (PRIM)及基于XML且开放的可扩展通讯和表示协议(XMPP)协议(常称 为Jabber 协议) 
 人们多次努力,试图统一各大主要IM供应商的标准(AOLYahoo  Microsoft),但无一成功,且每一种IM仍然继续使用自己所拥有的协议 





即时通讯在垂直社交应用中的意义 

• 和第一代大而全的水平网站(又称综合性网站)不同,垂直网站注意 力集中在某些特定的领域或某种特定的需求,提供有关这个领域或需 求的全部深度信息和相关服务,作为互联网的新亮点,垂直网站正引 起越来越多人的关注。在越来越多的网络吸引老百姓的注意力时,网 民却逐渐走出时髦、好奇的初级阶段,不断在网上寻找着实际、实用 和实惠
• 随着移动互联网应用的发展,现在越来越多的App正在向垂直应用迁 移,垂直应用中同类用户群体之间的沟通,产生聚合就显得尤为重要 了,因此目前国内市场的XMPP应用开发的人才需求非常大 



XMPP起源 
 XMPP是基于XML的协议,用于即时消息(IM)以及在线现场探测。最初, XMPP作为一个框架开发,目标是支持企业环境内的即时消息传递和联机状态 应用程序。当时的即时消息传递网络是私有的,不适合企业使用 
 XMPP前身是Jabber(1998年),是一个开源组织定义的网络即时通信协议 
 XMPP是一个分散型通信网络,这意味着,只要网络基础设施允许,任何 XMPP用户都可以向其他任何XMPP用户传递消息。多个XMPP服务器也可以 通过一个专门的“服务器-服务器"协议相互通信,提供了创建分散型社交网 络和协作框架的可能性 
 尽管XMPP的出现是为了满足“个人-个人"即时消息传递的要求,但它完全 不必局限于此任务 




XMPP概述 

 XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性。这表明 XMPP是可扩展的。可以通过发送扩展的信息来处理用户的需求,以及在 XMPP的顶端建立如内容发布系统和基于地址的服务等应用程序。而且, XMPP包含了针对服务器端的软件协议,使之能与另一个进行通话,这使得开 发者更容易建立客户应用程序或给一个配置好的系统添加功能 
 XMPP的核心XML传输协议的定义使得XMPP能够在一个比以往网络通信协 议更规范的平台上。借助于XML易于解析和阅读的特性,使得XMPP的协议能 够非常漂亮 
 XMPP的即时通讯扩展应用部分是根据IETF在这之前对即时通讯的一个抽象定 义的,与其他业已得到广泛使用的即时通讯协议,诸如AIM,QQ等有功能完 整,完善等先进性 
 XMPP的扩展协议Jingle使得其支持语音和视频,目前iOS尚不支持 
 XMPP的官方文档是RFC 3920 
 XMPP协议曾经是Google力推的即时通信协议,其代表作品是GTalk 



Google Talk(GTalk

 Google TalkGoogleIM工具,除了具有IM功能外,另外还加上了 
Voip功能,界面清新大方",可直接链接Gmail,接受查看邮件 
 由于Google Talk基于Jabber开源标准,这种标准允许用户和其它的 即时讯息系统相连,比如苹果电脑的iChat,GAIM,Trillian Pro以及Psi Google Talk只能够在Windows平台上运行 
 Google Talk的用户无法使用这种软件与AIM,MSN Messenger或者雅 虎Messenger的用户进行互通 



GTalk界面截图 






GTalk即将退出历史舞台 

 20135月,在Google I/O大会上,Google推出统一跨平台聊天应用 
Hangouts(环聊)取代Google Talk 
 Google Hangouts不支持XMPP协议Google Hangouts用户与非Google 
服务如XMPP协议的强有力支持者jabber.org之间的交流无法进行 
 目前,Google Wave是基于XMPP协议的,并且Google还开发Jingle扩 展进行基于XMPP协议的视频聊天。尽管Google尚未宣布Talk的关闭日 期,不过从Google关闭ReaderiCal支持来看,Talk关闭之日不会太远 



Google Hangouts宣传截图

Hangouts目前在中国大陆无法使用,尚不支持iOS7.0


XMPP定义 
• XMPP:The Extensible Messaging and Presence Protocol(可扩展通讯
和表示协议)
• XMPP可用于服务类实时通讯、表示和需求响应服务中的XML数据元 流式传输XMPPJabber协议为基础,而Jabber是即时通讯中常用 的开放式协议
• XMPP是基于XML的协议,用于即时消息(IM)以及在线现场探测。 促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向 因特网上的其他任何人发送即时消息,即使其操作系统和浏览器不同



XMPP的基本结构

 XMPP是一个典型的C/S架构,而不是像大多数即时通讯软件一样, 使用P2P客户端到客户端的架构,也就是说在大多数情况下,当两个 客户端进行通讯时, 他们的消息都是通过服务器传递的。采用这种架 构,主要是为了简化客户端,将大多数工作放在服务器端进行 
 XMPP中定义了三个角色,客户端,服务器,网关通信能够在这三 者的任意两个之间双向发生 
 服务器同时承担了客户端信息记录,连接管理和信息的路由功能 
 网关承担着与异构即时通信系统的互联互通,异构系统可以包括 
SMS(短信),MSN,ICQ 
 基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上 传输XML 



XMPP工作原理 

1. 节点连接到服务器 2. 服务器利用本地目录系统中的证书对其认证 3. 节点指定目标地址,让服务器告知目标状态 4. 服务器查找、连接并进行相互认证 5. 节点之间进行交互 



传输内容 

• XMPP应用传输的是与即时通讯相关的指令。在以前这些命令要么用 二进制的形式发送(比如QQ),要么用纯文本指令加空格加参数加换 行符的方式发送(比如MSN)
• XMPP传输的即时通讯指令的逻辑与以往相仿,只是协议的形式变 成了XML格式的纯文本。这不但使得解析容易了,人也容易阅读了, 方便了开发和查错
• XMPP的核心部分就是一个在网络上分片段发送XML的流协议。这 个流协议是XMPP的即时通讯指令的传递基础,也是一个非常重要的 可以被进一步利用的网络基础协议,可以说XMPPTCP传的是XML 



XMPP的优缺点 
• 优点开放
标准(XMPP的技术规格已被定义在RFC 3920RFC 3921) - 证实可用分散安全
可扩展
• 缺点数据负载过重没有二进制传输



XMPP的传输小结 
• XMPP是一种类似于HTTP协议的一种数据传输协议,其过程就 如同“解包装--〉包装"的过程。只需要理解其接收的类型返 回的类型,便可以很好的利用XMPP来进行数据通讯
• XMPP官方网站--http://xmpp.org 

 



服务器搭建--安装MySQL 



启动MySQL服务器 



设置MySQL命令行搜索路径 

 打开终端,输入: 
 vi ~/.bash_profile 
 输入i 
 然后粘贴以下内容



#mysql
alias mysql='/usr/local/mysql/bin/mysql'
alias mysqladmin='/usr/local/mysql/bin/mysqladmin'
#ls
alias ls='ls -G

                                                                            
 ESC 
 输入:wq 
 重新启动终端程序 



修改MySQL的管理员密码 
 mysqladmin -u root password “123456"



安装MySQL管理工具--Navicat Premium 



建立数据库连接(1


建立数据库连接(2)




新建数据库--Openfire




彻底删除MySQL的方法 
.1. 先停止所有mysql有关进程 
.2. sudo rm /usr/local/mysql 
.3. sudo rm -rf /usr/local/mysql* 
.4. sudo rm -rf /Library/StartupItems/MySQLCOM 
.5. sudo rm -rf /Library/PreferencePanes/My* 
.6. sudo vi /etc/hostconfig # removed the line MYSQLCOM=-YES- 
.7. rm -rf ~/Library/PreferencePanes/My* 
.8. sudo rm -rf /Library/Receipts/mysql* 
.9. sudo rm -rf /Library/Receipts/MySQL* 
.10. sudo rm -rf /var/db/receipts/com.mysql.* 



显示隐藏文件 
 在终端中输入以下命令,可以切换隐藏文件的显示 
 显示隐藏文件 
 defaults write com.apple.finder AppleShowAllFiles Yes && killall Finder 
 不显示隐藏文件 
 defaults write com.apple.finder AppleShowAllFiles No && killall Finder 
 提示:

Ø OS X 10.9 Mavericks需要将Finder修改成finder才行,第一个字母换 
成小写的f
Ø 以上命令类似与在iOS开发中的 
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"com.apple.finder"]; 



服务器搭建--Openfire 
• 可用服务器地址:http://xmpp.org/xmpp-software/servers/
• 课程选用:Openfire

 Openfire简介
- 采用Java开发,开源的实时协作(RTC)服务器,基于 XMPP(Jabber)协议 
- 安装Openfire之前,需要确认是否安装了JDK 
- 如果没有,需要安装jdk-7u45-macosx-x64 
- 可以轻易的构建高效率的即时通信服务器 
- 安装和使用简单,并利用Web进行管理 
- 单台服务器可支持上万(1000)并发用户 



Openfire安装

• 下载并安装:
http://www.igniterealtime.org/projects/openfire/index.jsp
• 安装位置:/usr/local/openfire/
 安装位置该文件夹的用户访问权限
• 数据库脚本保存在/usr/local/openfire/resources/database文件夹下



修改/usr/local/openfire/目录权限

 

设置openfire数据库 
1. /usr/local/openfire/resources/database/openfire_mysql.sql
制到桌面2. Navicat中新建Query,导入该文件并执行



Openfire设置 
1. 在系统偏好中确保Openfire服务已经启动
2. 使用浏览器访问:http://localhost:9090
3. 如果需要重新配置,可以修改/usr/local/openfire/conf/openfire.xml,将末尾的true修改为 false

4.重新设置安装openfire,不会影响其中的用户,只是在忘记密码时,进行的操作.



设置语言 



设置服务器(注意域名) 


选择数据库连接方式



设置数据库




设置管理员密码--不要跳过! 



配置完成并登录 



Openfire服务器端口 




新建用户 



客户端设置测试Openfire服务器 



 

XMPP--JID 

 每个 XMPP客户端用户必须拥有一个全局惟一标识符。基于历史原因, 这些标识符称为 Jabber IDJID。鉴于协议的分布式特征,JID应包含 联系用户所需的所有信息,JID的结构类似于电子邮件地址,但不要求 JID同时也是有效的电子邮件收件人 
 客户端和服务器节点,被统称为 XMPP实体,都拥有JID。例如: SomeCorp公司的员工 John Doe可能拥有JID: John.Doe@somecorp.com,其中somecorp.com SomeCorp公司的 XMPP服务器的地址,John.DoeJohn Doe的用户名 
 还可以使用JID连接到其他资源。这允许在一个XMPP实体标识符之外 进一步处理拓展 



支持XMPP协议的客户端 

Spark Adium 

 

 

• 体会XMPP目前所能支持的功能并且构思即将开发的XMPP项目所能包含的功能 


iOSXMPP框架--XMPPFramework

• 其他语言可用框架地址:
http://xmpp.org/xmpp-software/libraries/
• 课程选用:XMPPFramework,唯一可用的OC框架 



导入XMPPFramework框架(1)

Ø 下载XMPPFramework框架:
https://github.com/robbiehanson/XMPPFramework
Ø gitclone
git clonehttps://github.com/robbiehanson/XMPPFramework.git
Ø 导入依赖框架

 

CocoaLumberjack:日志框架 CocoaAsyncSocket:底层网络框架,实现异步Socket网络通讯
需要添加CFNetwork&Security框架依赖 KissXML:XML解析框架
需要添加libxml2.dylib框架依赖
需要指定如下编译选项:
OTHER_LDFLAGS = -lxml2 HEADER_SEARCH_PATHS =/usr/include/libxml2
libidn
-

设置XML头文件搜索路径 




设置其他链接标记 



导入XMPPFramework框架(2

• 将以下4个文件夹导入到项目 - Authentication
- Categories - Core
- Utilities
• 另外还需要添加libresolv.dylib依赖 



导入XMPPFramework框架(3)

• 导入XMPP扩展框架
- Extensions
• Sample_XMPPFramework.h添加到项目,并且重命名为
XMPPFramework.h
• 在终端输入:git commit -m “添加XMPP框架" 
• 可以一次性提交所有增加的文件 



XMPP框架常用扩展

 XEP-0045: 多用户聊天 
 XEP-0060: 发布-订阅 
 XEP-0065: SOCKS5字节流 
 XEP-0085: 聊天状态通知 
 XEP-0096: 文件传输 
 XEP-0172: 用户昵称 
 XEP-0184: 消息送达 
 CoreDataStorage: 数据存储 
 Reconnect:重新连接 
 Roster:花名册 
 http://xmpp.org/xmpp-protocols/xmpp-extensions/ 

      

新建项目并导入XMPP框架练习

• 熟练掌握XMPP框架的导入过程
• 并且构思即将开发的XMPP项目所能包含的功能 



CocoaLumberjack

• 是一款高性能的日志输出插件
• 需要配合XcodeColors插件一起使用https://github.com/robbiehanson/XcodeColors



Common.h

#import "DDLog.h"!
#import
 "DDTTYLogger.h"!
!
#ifdef DEBUG!
static const int ddLogLevel =LOG_LEVEL_VERBOSE;! #else!
static const int ddLogLevel = LOG_LEVEL_OFF;! #endif 



应用程序启动后设置跟踪级别

[DDLog addLogger:[DDTTYLogger sharedInstance]];! [[DDTTYLogger sharedInstance] setColorsEnabled:YES];!
[[DDTTYLogger sharedInstance] setForegroundColor:[UIColor blueColor] backgroundColor:nilforFlag:LOG_FLAG_INFO];!
!
DDLogInfo(@"提示信息");! DDLogWarn(@"警告信息");! DDLogVerbose(@"详细信息");!DDLogError(@"错误信息"); 



XMPP核心文件

 XMPPStream:是开发过程中最主要交互的类,所有扩展和自定义代 
码均要基于此类进行 
 XMPPParser:供XMPPStream解析使用 
 XMPPJID:提供了一个不可变JID的实现,遵守NSCopying协议和 NSCoding协议 
 XMPPElement:以下三个XMPP元素的基类 
 XMPPIQ :请求 
 XMPPMessage :消息 
 XMPPPresence :出席 
 XMPPModule:开发XMPP扩展时使用 
 XMPPLogging:XMPP的日志框架 
 XMPPInternal:整个XMPP框架内部使用的核心和高级底层内容 



XMPPStream实例的配置

1. 配置如何连接至XMPP服务器 2. 添加代理3. 添加模块4. 开始连接
5. 开始授权 • 注意:
XMPP框架仅提供了一个最小的代理委托系统用于接收三种XMPP 类型(IQMessagePresence),如果要实现更多的功能,开发 者还需要编写大量的相关代码
为了简化开发,通常将XMPPStream放置在AppDelegate,以便 于全局访问 



XMPP框架提供的主要扩展功能

 XMPPReconnect:如果意外中断,自动重连XMPP  XMPPRoster:标准的XMPP花名册 XMPPRoom:提供多人聊天支持XMPPPubSub:提供公共订阅支持
• ...... 


通信类别及公共XML属性

• 使用XMPP的实时消息传递系统包含三大通信类别: - 消息传递,其中数据在有关各方之间传输 - 联机状态,允许用户广播其在线状态和可用性 - 信息/查询请求,它允许XMPP实体发起请求并从另一个实体接收响应
• 以上三种类型的XMPP节都拥有以下公共属性: -from:源XMPP实体的JID - to:目标接收者的JID - id:当前对话的可选标识符 
- type:节的可选子类型 - xml:lang:如果内容是人们可读的,则为消息语言的描述 



XMPP应用程序功能预设

• 用户登录、注册 • 添加好友Roster • 好友聊天• 表情文字(CoreText) • 聊天状态XEP-0085
• 聊天室群聊XEP-0045 • 发送文件XEP-0096 • 语音聊天XEP-0065


© chenyilong. Powered by Postach.io
posted @ 2014-03-07 22:40  iTeaTime(技术清谈)  阅读(705)  评论(0编辑  收藏  举报