一、说明
XMPP :Extensible Messaging and Presence Protocol,以Jabber协议(XMPP协议前身)为基础;XMPP协议基于可扩展标记语言XML,建立TPC/IP连接,完成C/S、C/C、S/S之间的数据传输。XMPP是一个消息传输国际化标准协议。最初,XMPP作为一个框架开发,目标是支持企业环境内的即时消息传递和联机状态应用程序。 XMPP前身是Jabber(1998年),是一个开源组织定义的网络即时通信协议。XMPP是一个分散型通信网络,XMPP的核心XML流传输协议;XMPP协议曾经是Google力推的即时通信协议,其代表作品是GTalk。XMPP可用于服务类实时通讯、表示和需求响应服务中的XML数据元流式传输。XMPP以Jabber协议为基础,而Jabber是即时通讯中常用的开放式协议。
二、工作原理
节点连接到服务器 服务器利用本地目录系统中的证书对其认证 节点指定目标地址,让服务器告知目标状态 服务器查找、连接并进行相互认证 节点之间进行交互。
三、四个概念
XMPP服务器(不需要我们自己写)
XMPP客户端(iOS android win)
XMPP协议
XMPPFramework(三方框架)
经典服务器端Openfire
OpenFire是由JiveSoftware推出的一款经典XMPP Server,用Java编写,并且开源。OpenFire由XMPPServer+JavaWebServer(嵌入式jetty容器)组成,前者基于XMPP协议进行通信,后者是一个Web管理后台(HTTP/HTTPS). Openfire基于MINA框架,MINA框架是Java体系中目前应用非常广泛的一个通信框架。 MINA基于NIO,前身是Netty2,Netty2的架构不是很好,由Trustin Lee在2004年重写并改名为MINA。 NIO自JAVA 1.4之后加入JDK中,其核心内容便是非阻塞的,高性能的底层IO。换言之JDK 4之前的IO阻塞问题需要开发者自行解决。
Openfire的数据库选择
OpenFire是server端,因此数据库一般来说用C/S型DBMS比较好(SQLServer,MySQL,Oracle等),为了良好的并发性能,基本上不考虑SQLite这种嵌入式数据库(OpenFire的实现中也没有这个选项)。
外接数据库:如果OpenFire使用的数据库是独立的数据库服务器,那么这个配置过程叫做数据库外接,数据库外接可以让Openfire的数据库表写入一个已经存在的数据库中,方便我们做数据同步。
内置数据库:偶尔也会使用Openfire内置的数据库(PostgreSQL),Openfire称之为嵌入式数据库,但是不代表PostgreSQL是一款像SQLite的嵌入式数据库,PostgreSQL仍然是一款C/S架构的DBMS,只不过Openfire将其源码附加在自己的安装包中可以直接使用而已。
Openfire的安装
如果需要卸载MySQL,先停止MySQL服务在执行清理脚本,否则会出现问题
先准备好数据库,如果是外接数据库,需要先在对应的数据库中准备好相应的Schema,例如:
CREATE SCHEMA HMOpenFire;
CREATE DATABASE HMOpenFire;
在MySQL中以上两句SQL效果一样。
如果使用的是MySQL数据库,提前配置好schema的字符集为UTF8,因为MySQL的默认字符集是拉丁文,如果稍微不注意可能以后不方便保存中文。
安装好Openfire
安装好之后,访问localhost:9090 配置本地域,管理员账户,端口等一些简单配置。这些配置都可以通过XML配置文件修改。
配置正确的数据库连接URL java中的数据库连接为jdbc,java中直接连接数据库与jdbc-odbc桥有所不同,jdbc不需要配置数据源,只需要加载对应数据库的jdbc驱动即可。这些驱动已经附加在openfire安装包中,我们只需要选择即可。 而URL需要自己配置,例如mysql的数据库连接url为: jdbc:mysql://host:port/dbname?key1=value1&key2=value2…. 常见参数:(openfire有单独处理用户名和密码,不必写入url)
user 用户名
password 密码
autoReconnect 联机失败,是否重新联机(true/false)
maxReconnect 尝试重新联机次数
initialTimeout 尝试重新联机间隔
maxRows 传回最大行数
useUnicode 是否使用Unicode字体编码(true/false)
characterEncoding 何种编码(GB2312/UTF-8/…)
relaxAutocommit 是否自动提交(true/false)
capitalizeTypeNames 数据定义的名称以大写表示
结束openfire的配置,进入对应的数据库schema,检查openfire的系统表是否建表成功,以及初始数据是否插入成功,如果没问题就可以开始使用。
无效的JabberID — JID 什么才是合法的JabberID: wwh@im.itheima.com->bare wwh@im.itheima.com.[设备名或资源名(可改动)] - full
使用 信息App 或者 Spark 等尝试登陆我们的OpenFire服务器进行聊天
由于MacOS自带的信息App支持Jabber协议,比较方便我们测试服务器的功能是否正常。当然JiveSoftware提供的Spark也能登陆我们的服务器,只不过这个软件需要相应的JAVA环境才可以运行(JDK)。
登陆时,如果本地域可以被正确解析为server的IP地址,那么无需单独配置IP。反之需要填写IP地址。默认的端口为5222。
登陆完成后,进入9090后台,查看会话列表,观察我们的上下线状态。
四、导入XMPPFramework-iOS框架进行我们自己的客户端编写
1. 在Build Setting 搜索Header Search Paths 添加头文件搜索路径:/usr/include/libxml2
2. 在Build Phasses 添加2个动态链接库:libxml2.dylib libresolve.dylib
3. 在Build Setting 搜索prefix 在Prefix Header中添加$SRCROOT/$(PRODUCT_NAME)/PrefixHeader.pch 添加pch文件,导入UIKit
4. build成功
五、框架初步认识
(一)Core核心库
XMPPStrem负责处理Socket流的连接断开读写等
XMPPElement:DDXMLElement子类,from、to、id;
XMPPJIDJabberID 对象,由 用户名@本地域/资源类型 组成bare只包含用户名和本地域的NSString,缺少资源类型full 完整的JID的NSString,包含资源类型
XMPPMessage< message type = “unkown”\>基础消息XML对象。消息正文位于\\中type属性一般有:normal,chat,groupChat
XMPPPresence\出席XML对象
子节点: show(有固定的类型) status
type属性一般有:available(上线 默认值),unavailable,subscribe,subscribed,unsubscribe,unsubscribed,probe等
XMPPIQ
信息/查询 XML对象
子节点: error
type属性一般有: result,error,set,get等 XMPPMessage,XMPPIQ,XMPPMessage都是XMPPElement的子类
XMPPModule
可以理解为功能模块的抽象类,基本上不可能直接实例化这个类
一些公有方法: active deactive等
扩展库
XMPPReconnect,XMPPAutoPing ,XMPPRoster,XMPPMessageArchiving,XMPPRoom,XMPPFileTransfer,XMPPVCardTemp,XMPPAvatar等附加功能模块,基本上都是继承XMPPModule
XMPPCoreDataStorage —CoreData存储器抽象类,基本上上述模块对应都有各自的实现
XMPPXXXXCoreDataStorageObject — 各个模块中的托管对象
GCDAsyncSocket、GCDMulticastDelegate,DDLog,XCodeColors 等三方框架
Xcode插件失效解决办法
1.打开xcode插件所在的目录: /{当前用户名}/ Library/Application\ Support/Developer/Shared/Xcode/Plug-ins
2.选择已经安装的插件例如VVDocument,右键点击show package contents,
3.找到info.plist 文件,找到DVTPlugInCompatibilityUUIDs的项目,
4.添加C4A681B0-4A26-480E-93EC-1218098B9AA0(当前xcode的一个号码),这个号码怎么得到? 在终端执行 defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
5.再右键“打开包内容”双击contents\MacOS目录下的一个黑色图标,会打开终端窗口,最后打印“进程已完成”之类,
6.重启xcode
开启XCodeColors
配置DDLog颜色,开启enable属性
schema中添加环境变量 XcodeColors = YES
网友评论