XMPPFramework简介

1. XMPP(简单了解)

  • XMPP 即时通讯协议
  • 牛逼代表作品:iChat/Google Talk

2. 环境配置

  • 安装mySql

  • 修改mySql账户密码。

    1. 在使用sqlite(移动平台)是没有密码直接链接到数据库
    2. mySql和sqlServer(服务端的数据库)是需要账户密码
    3. 默认情况下账户是root,密码为空
  • 使用命令登陆mySql

    • sudo vi ~/.bash_profile
      • vi:编辑模式。~代表当前目录。(pwd查看当前目录)
      • 删除命令:sudo rm -rf .bash_*
    • 输入i
    • 然后粘贴一下内容
    • mySql用来登陆
    • 在用户目录下mysql -u root -p
    • show databases; 显示当前数据库
    • mySqladmin:管理账号
    • 退出mysql目录 exit;
    • mysql管理工具
  • 安装openfire服务

    • openfire服务器是基于java语言开发,也就意味着电脑有java运行环境
    • 查看电脑是否安装了java的运行环境
    • 在终端:java -version
    • 配置openfire
      1. 配置数据库(在mySql 创建一个openfire数据库供openfire服务器使用)
      2. 导入openfire里面的数据库表脚本文件
      3. 配置openfire的管理员密码
  • 使用客户端登陆openfire的服务器

    • 系统的“信息”账号名称 = 用户名+@+服务器名称:teacher.local
    • 登陆的时候,可以自己配置下域名
      1. 修改/ect/hosts;
      2. 打开终端,使用命令"sudo vi/ect/hosts"->添加teacher.local地址
##
# Host Database
# localhost is used to configure the loopback interface
# when the system is booting. Do not change this entry.
##

127.0.0.1 localhost
127.0.0.1 teacher.local
255.255.255.255 broadcasthost
::1 localhost

  • XMPPFramework目录结构

    • Authentication:授权(跟登陆有关 ):客户端最终是以账号和密码的方式登陆
    • Categories:分类
    • Core:核心代码:客户端跟服务端交互的时候会用到这里的一些类
    • XMPPStream:输入输出流:用于跟服务器交换数据,收发数据
    • XMPPMessage:发生聊天消息
    • Extensions:扩展模块:
      1. 聊天数据保存到数据库在这里XMPP已经实现相应的模块。
      2. 好友列表
    • Utilities:工具类
    • Vendor:供应商(俗称第三方框架)
    • CocoaAsyncSocket:异步Socket:防止阻塞主线程:对CFReadStream和CFWriteStream进行了封装。直接的面向对象的
    • CocoaLumberjack:日志
    • KissXML:解析xml:XMPP的传输协议都是以XML格式传输数据
    • Xcode:XMPP官方的实例程序
  • iPhoneXMPP项目演示:

    • SettingsViewController.xib:项目的登陆页面
    • 查找done按钮做了哪些操作
    • 将用户输入的用户名和密码存到设备的沙盒里
    • 在跟控制器中viewwillAppear中connect
    • 设置用户的用户名JID
      1. xmppStreamDidConnct代表连接服务器成功,成功之后发送密码
      2. xmppStreamDidAuthenticate:登陆成功。

3. 异步Socket框架GCDAsyncSocket

  • 加入GCDAsyncSocket框架:GCD:线程
  • 重写链接到服务器
  • 导入头文件,定义成员属性
  • 初始化GCDAsyncSocket,initWithDelegate:delegateQueue;
  • 全局队列:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT(默认标示),0)
  • 链接到服务器 connectToHost:onPort:error;
  • GCDAsyncSocket的代理方法
  • socket:didConnectToHost:链接到主机成功的代理方法
  • socketDidDidconnect:跟主机断开链接
  • 登陆 直接调用socket的 writeData:withTimeOut:tag 发送登陆指令到服务器(-1 代表不超时)
  • 读取数据调用socket:didReadData:withTag代理方法,服务器有数据会调用代理
  • 代理方法查看数据是否成功发送到服务器:socket:didWriteDataWithTag成功发送代理方法
  • 在socket:didWriteDataWithTag代理方法手动调用读取数据的方法:readDataWithTimeOut,手动调完之后才会调用11的代理方法
  • 发送聊天消息socket调用 writeData:withTimeOut:tag
  • 在socket:didReadData:withTag放法中调用刷新表格
  • has join 显示延迟,在接受数据里面打印当前[NSThread currentThread]
  • UI刷新需要放在主线程中,所以在dispatch_async(dispatch_get_main_queue,block)中属性表格
  • 根据tag 判断是否显示has join 数据
  • GCDAsyncSocket已经封装了CFReadStreamRef 和 CFWriteStreamRef

4. xmpp框架导入

  • libresolv.dylib、libxml2.dylib
  • Other Linker Flags -lxml2
  • Header Search Path /usr/include/libxml2
  • 用户登陆,登陆之前查看xmpp的概述
  • XMPPIQ :请求:将XML中的所有字节全部封装成对象

5. 微信项目(iPhone/ipad版本)

登陆:(在Appdelegate中实现登陆,定义一个XMPPStream成员变量)

  • 初始化XMPPStreatment直接init
    1. 设置代理调用addDelegate:delegateQueue:全局队列dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT(默认标示),0)
  • 链接到服务器(传一个JID)
    1. 使用XMPPStream对象调用connectWithTimeOut:error:
    2. 方法注释:链接到指定的主机和指定的端口,timeout是可选的,如果没有超时使用XMPPStreamTimeOutNone,如果主机或者JID没有设置,这个方法会返回NO,也就是参数没有设置正确
    3. connectWithTimeOut:error根据返回值判断打印错误信息
    4. 程序一启动就链接到主机
    5. 如果XMPPStream对象为空那么就调用初始化方法
    6. 设置登陆用户的,使用XMPPStream对象的myJid属性是一个XMPPJID对象
    7. 初始化一个XMPPJID对象,使用jidWithUser:domain(域名):resource:(标示用户登陆的客户端,iphone or android)
    8. 设置域名:XMPPStream对象的hostName属性设置“teacher.local”或者是ip地址,其实第七步已经设置
    9. 设置端口号:hostport默认端口就是5222
    10. 实现XMPPStream的代理方法,链接主机成功:xmppStreamDidConnect;链接主机失败:xmppStreamDidDisConnect:withError 如果有错误就的链接失败,没有错误是正常断开链接
  • 链接服务器成功,再发生密码授权
    1. XMPPStream对象的authenticateWithPassword:error方法
    2. 在链接成功的代理方法中发送密码
    3. 密码验证成功调用XMPPStream的代理方法:xmppStreamDidAuthenticate
    4. 授权失败:xmppStream:didNotAuthenticate
  • 授权成功后,发送在线消息
    1. XMPPPresence调用presence初始化一个对象,他是一个xml的节点
    2. XMPPStream的对象调用sendElement:presence方法
    3. 在授权成功调用
  • 注销
    1. 发送离线消息:XMPPPresence 调用presenceWithType:@"unavailable"初始化一个对象
    2. 与服务器断开链接XMPPStream对象调用disconnect

你可能感兴趣的:(XMPPFramework简介)