xmpp版即时聊天

xmpp版即时聊天

即时聊天的解决方案

  • socket:
  • xmpp:xmpp+openfire+asmack

常见协议

通信共性

  1. 有客户端和服务端
  2. 客户端和服务端要通信,需要保持连接

开发即时通讯软件的类型

  • 定制开发
    • 自己搭建服务端,自己去基于xmpp协议做开发
    • 核心:熟悉asmak.jar相关的api
  • 集成开发
    • 使用第三方的东西(环信,融云通讯)
    • 核心:了解第三方api

简单聊一下socket

socket:套接字,连接需要ip端口,分为tcp和udp两种形式

常见的术语

  • xmpp:基于xml的可拓展协议.
  • jabber:xmpp的前身.
  • openfire:支持xmpp的开源服务器
  • smack.jar:对xmpp协议封装.方便开发的jar包.
  • spark.exe:基于xmpp的pc客户端;
  • asmack.jar:smack.jar的精简版.专门针对android端开发

xmpp的认识.

  • xmpp官网:http://xmpp.org/

xmpp特点:

  1. 开放: XMPP协议是自由、开放、公开的,并且易于了解。 而且在客户端 、 服务器 、 组件 、 源码库等方面,都已经各自有多种实现。
  2. 标准: 互联网工程工作小组( IETF )已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。 而XMPP的技术规格已被定义在RFC 3920及RFC 3921 。 任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。
  3. 证实可用: 第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相​​当稳定;数以百计的开发者为XMPP技术而努力。 今日的互联网上有数以万计的XMPP服务器运作着,并有数以百万计的人们使用XMPP实时传讯软件。
  4. 分散式: XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。 任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。
  5. 安全: 任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已自带于核心XMPP技术规格中。
  6. 可扩展: XML 命名空间的威力可使任何人在核心协议的基础上建造定制化的功能;为了维持通透性,常见的扩展由XMPP标准基金会 。 弹性佳 XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。
  7. 多样性: 用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境。

相关的下载

asmack github:https://github.com/Flowdalic/asmack
asmack下载地址1:http://asmack.freakempire.de/
asmack下载地址2:http://code.google.com/p/asmack/downloads/list
openfire下载地址:http://www.igniterealtime.org/downloads/index.jsp
smack使用指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html

openfire的安装

  1. 官网http://www.igniterealtime.org/
  2. 安装包的类型
    1. exe安装包–>点击exe根据提示安装
    2. zip包解压版–>解压放到指定目录就可以了.
  3. 首次运行的配置
    1. 配置语言–>中文简体
    2. 配置数据库形式–>内嵌数据库
    3. 配置服务器名称–>itheima
    4. 配置管理员账号密码–>admin admin
  4. 创建用户
    1. admin admin
    2. hm1 111111

spark的安装–>xmpp客户端1

  • 直接下一步就可以完成
  • 运行
    • 1.配置服务器ip
    • 2.输入用户账号/密码

如意通的安装–>xmpp客户端2

pc端-服务器-pc端演示

smack常见api的查看.

xmpp版即使聊天的核心:其实就是熟悉asmack.jar里面的一些常见类.以及常见监听器;

工程搭建

  1. asmack.jar的下载,下载地址http://asmack.freakempire.de/
  2. 创建android工程.
  3. 添加jar包.添加依赖
  4. as关联源码.

引导页模块splashActivity

  1. ThreadUtils的封装.

登录模块LoginActivity

  1. 引入了ButterKnife.jar以及as的android-butterknife-zelezny插件
  2. ButterKnife:类似xutils中的viewUtils
  3. 调用api登录

连接配置

// 设置常见的参数
config.setDebuggerEnabled(true);// 开启调试模式,可以看到传输的xml
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);//明文传输

为什么联系人数据需要通过contentProvider保存到数据库

  1. 缓存联系人信息.不用每次从消息通道中获取–>本地缓存
  2. 可以使用ContentObserver监听数据信息的改变,实时更新UI

contentProvider回顾

  • 数据存储
    • 五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite
    • 共享数据的一种机制
  • 优势
    • 1)、ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的形式来组织数据。
    • 2)、使用ContentProvider可以在不同的应用程序之间共享数据
    • 3)、Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
  • 也就是
    • 1.可以是外部应用访问自己的数据
    • 2.规范数据的访问(crud)–>add delete update query

Uri介绍

  • 表示这个ContentProvider所提供的数据
  • 格式:content://com.itheima.www/teacher/1
    • 标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;”content://”
    • URI 的标识,用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称
    • 路径(path),通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就可以了;”content://com.bing.provider.myprovider/tablename”
    • 如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部; “content://com.bing.provider.myprovider/tablename/#” #表示数据id。

UriMatcher

  • Uri代表了要操作的数据,所以我们经常需要解析Uri,需要使用UriMatcher类用于匹配Uri

ContentUris

  • ContentUris类用于操作Uri路径后面的ID部分,它有1个比较实用的方法:
    withAppendedId(uri, id)用于为路径加上ID部分

通过ContentResolver得到数据

通过ContentObserver监听数据的改变

  1. 创建类继承contentObserver
  2. 重写onChange方法
  3. 注册内容观察者
  4. 反注册内容观察者
  5. 使用contentResolver发起数据的改变的信号

编写ContactProvider

  1. 创建contentProvider,配置
  2. 设计表字段
    1. _id:主键
    2. account:账号
    3. nickname:昵称
    4. avatar:头像
    5. pinyin:账号拼音
  3. 创建表
  4. 完成crud
  5. androidTest
  6. 使用cursorAdapter查询数据库显示数据
  7. 监听实时改变

RosterListener

    @Override
    public void entriesAdded(Collection<String> addresses) {// 增加
       //保存或更新
    }

    @Override
    public void entriesUpdated(Collection<String> addresses) {// 更新
        //保存或更新
    }

    @Override
    public void entriesDeleted(Collection<String> addresses) {// 删除
        //删除
    }

使用service完成Roster数据的同步.

因为service可以在后台运行,这样即使activity销毁也可以接受到roster的改变

  1. 创建服务
  2. 登录成功开启服务
  3. 服务里面同步roster数据到sqlite,以及监听监听roster的改变

是哟个service同步Roster数据好处

  1. fragment被销毁了.还可以监听花名册的改变
  2. 花名册获取和同步不用每次登陆都去操作,只需要操作一次
    1. 因为服务的OnCreate方法只有在创建服务的时候会调用,第二次启动服务,如果服务存在,是不会再走onCreate方法的,而是走onStartCommand方法

CursorAdapter

  • newView该函数第一次回调用后,如果数据增加后也会再调用,但是重绘是不会调用的。
    数据增加后,回调用该函数来生成与新增数据相对应的view。
  • bindView函数第一次回调用后,如果数据更新也会再调用,但重绘会再次调用的。

聊天

Message,Chat,ChatManager,MessageListener

  • 关键类

    1. Message:对消息的封装
    2. Chat:一次聊天,可以发送消息
    3. ChatManager:消息管理者
    4. MessageListener:消息的监听者
  • 开发步骤

      1. 响应点击事件
      1. 创建message
      1. 获取chatmanager
      1. 创建chat
      1. 发送消息,并且监听消息

创建SmsProvider

  • 为什么需要provider
    • 聊天记录需要存储起来.
    • 后面可以使用contentObserver监听会话信息的改变

SmsProvider开发步骤

  1. 创建provider 配置名字 authority urimather匹配地址
  2. 设计表结构
  3. 完成crud
  4. androidTest
  5. 使用cursorAdapter查询数据库显示数据
  6. 监听实时改变

SmsProvider 表结构

from_account
to_account
body
status
type
time
session_account

处理聊天记录

  1. 发送聊天信息的时候保存聊天信息
  2. 收到消息也要保存消息
  3. 使用cursorAdapter现实聊天记录

    1. 查询所有聊天信息–>升序排列
    2. 显示消息
    3. 发送或者接收消息,需要更新listview
    4. 发送或者接收消息,listview需要滚动

      if (adapter.getCursor().getCount() > 0) {
          mListView.setSelection(adapter.getCursor().getCount() - 1);
      }
      

聊天消息放到我们的service中

即使activity在后台还是可以收到消息.然后notification提示消息;
* 消息的发送放到service
* 消息的接收放到service
* 消息的保存放到service
* 消息的改变的contentObserver在chatActivity

如何调用service中的方法.

通过bindService绑定服务.因为我们服务已经创建,再绑定的,属于混合使用模式.所以这个时候ChatActivity销毁了.我们的服务不会销毁

回忆service三种启动模式

  • startService
  • bindService
  • startService->bindService

MessageListener,ChatManagerListener

  • MessageListener:创建会话的时候设置监听器.可以监听发送/接收消息,前提条件是必须先创建chat并且设置监听
  • ChatManagerListener:监听主动/被动创建chat,我们在这个时候绑定MessageListener就可以处理别人主动发来的消息;

完成会话列表.

  • 修改SmsProvider
  • 得到会话列表的cursor
  • 使用cursorAdapter显示数据
  • 使用ContentObserver监听最近一条消息.

viewpager中的孩子.

  • view
  • Fragment
  • Activity

#

  1. 发送消息
  2. 处理消息
  3. 创建对象
  4. 得到对象

xmpp版即时聊天

即时聊天的解决方案

  • socket:
  • xmpp:xmpp+openfire+asmack

常见协议

通信共性

  1. 有客户端和服务端
  2. 客户端和服务端要通信,需要保持连接

开发即时通讯软件的类型

  • 定制开发
    • 自己搭建服务端,自己去基于xmpp协议做开发
    • 核心:熟悉asmak.jar相关的api
  • 集成开发
    • 使用第三方的东西(环信,融云通讯)
    • 核心:了解第三方api

简单聊一下socket

socket:套接字,连接需要ip端口,分为tcp和udp两种形式

常见的术语

  • xmpp:基于xml的可拓展协议.
  • jabber:xmpp的前身.
  • openfire:支持xmpp的开源服务器
  • smack.jar:对xmpp协议封装.方便开发的jar包.
  • spark.exe:基于xmpp的pc客户端;
  • asmack.jar:smack.jar的精简版.专门针对android端开发

xmpp的认识.

  • xmpp官网:http://xmpp.org/

xmpp特点:

  1. 开放: XMPP协议是自由、开放、公开的,并且易于了解。 而且在客户端 、 服务器 、 组件 、 源码库等方面,都已经各自有多种实现。
  2. 标准: 互联网工程工作小组( IETF )已经将Jabber的核心XML流协议以XMPP之名,正式列为认可的实时通信及Presence技术。 而XMPP的技术规格已被定义在RFC 3920及RFC 3921 。 任何IM供应商在遵循XMPP协议下,都可与Google Talk实现连接。
  3. 证实可用: 第一个Jabber(现在XMPP)技术是Jeremie Miller在1998年开发的,现在已经相​​当稳定;数以百计的开发者为XMPP技术而努力。 今日的互联网上有数以万计的XMPP服务器运作着,并有数以百万计的人们使用XMPP实时传讯软件。
  4. 分散式: XMPP网络的架构和电子邮件十分相像;XMPP核心协议通信方式是先创建一个stream,XMPP以TCP传递XML数据流,没有中央主服务器。 任何人都可以运行自己的XMPP服务器,使个人及组织能够掌控他们的实时传讯体验。
  5. 安全: 任何XMPP协议的服务器可以独立于公众XMPP网络(例如在企业内部网络中),而使用SASL及TLS等技术的可靠安全性,已自带于核心XMPP技术规格中。
  6. 可扩展: XML 命名空间的威力可使任何人在核心协议的基础上建造定制化的功能;为了维持通透性,常见的扩展由XMPP标准基金会 。 弹性佳 XMPP除了可用在实时通信的应用程序,还能用在网络管理、内容供稿、协同工具、文件共享、游戏、远程系统监控等。
  7. 多样性: 用XMPP协议来建造及布署实时应用程序及服务的公司及开放源代码计划分布在各种领域;用XMPP技术开发软件,资源及支持的来源是多样的,使得使你不会陷于被“绑架”的困境。

相关的下载

asmack github:https://github.com/Flowdalic/asmack
asmack下载地址1:http://asmack.freakempire.de/
asmack下载地址2:http://code.google.com/p/asmack/downloads/list
openfire下载地址:http://www.igniterealtime.org/downloads/index.jsp
smack使用指南:http://www.igniterealtime.org/builds/smack/docs/latest/documentation/index.html

openfire的安装

  1. 官网http://www.igniterealtime.org/
  2. 安装包的类型
    1. exe安装包–>点击exe根据提示安装
    2. zip包解压版–>解压放到指定目录就可以了.
  3. 首次运行的配置
    1. 配置语言–>中文简体
    2. 配置数据库形式–>内嵌数据库
    3. 配置服务器名称–>itheima
    4. 配置管理员账号密码–>admin admin
  4. 创建用户
    1. admin admin
    2. hm1 111111

spark的安装–>xmpp客户端1

  • 直接下一步就可以完成
  • 运行
    • 1.配置服务器ip
    • 2.输入用户账号/密码

如意通的安装–>xmpp客户端2

pc端-服务器-pc端演示

smack常见api的查看.

xmpp版即使聊天的核心:其实就是熟悉asmack.jar里面的一些常见类.以及常见监听器;

工程搭建

  1. asmack.jar的下载,下载地址http://asmack.freakempire.de/
  2. 创建android工程.
  3. 添加jar包.添加依赖
  4. as关联源码.

引导页模块splashActivity

  1. ThreadUtils的封装.

登录模块LoginActivity

  1. 引入了ButterKnife.jar以及as的android-butterknife-zelezny插件
  2. ButterKnife:类似xutils中的viewUtils
  3. 调用api登录

连接配置

// 设置常见的参数
config.setDebuggerEnabled(true);// 开启调试模式,可以看到传输的xml
config.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);//明文传输

为什么联系人数据需要通过contentProvider保存到数据库

  1. 缓存联系人信息.不用每次从消息通道中获取–>本地缓存
  2. 可以使用ContentObserver监听数据信息的改变,实时更新UI

contentProvider回顾

  • 数据存储
    • 五种,分别是:Shared Preferences、网络存储、文件存储、外储存储、SQLite
    • 共享数据的一种机制
  • 优势
    • 1)、ContentProvider为存储和获取数据提供了统一的接口。ContentProvide对数据进行封装,不用关心数据存储的细节。使用表的形式来组织数据。
    • 2)、使用ContentProvider可以在不同的应用程序之间共享数据
    • 3)、Android为常见的一些数据提供了默认的ContentProvider(包括音频、视频、图片和通讯录等)。
  • 也就是
    • 1.可以是外部应用访问自己的数据
    • 2.规范数据的访问(crud)–>add delete update query

Uri介绍

  • 表示这个ContentProvider所提供的数据
  • 格式:content://com.itheima.www/teacher/1
    • 标准前缀,用来说明一个Content Provider控制这些数据,无法改变的;”content://”
    • URI 的标识,用于唯一标识这个ContentProvider,外部调用者可以根据这个标识来找到它。它定义了是哪个Content Provider提供这些数据。对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个完整的、小写的类名。这个标识在 元素的 authorities属性中说明:一般是定义该ContentProvider的包.类的名称
    • 路径(path),通俗的讲就是你要操作的数据库中表的名字,或者你也可以自己定义,记得在使用的时候保持一致就可以了;”content://com.bing.provider.myprovider/tablename”
    • 如果URI中包含表示需要获取的记录的ID;则就返回该id对应的数据,如果没有ID,就表示返回全部; “content://com.bing.provider.myprovider/tablename/#” #表示数据id。

UriMatcher

  • Uri代表了要操作的数据,所以我们经常需要解析Uri,需要使用UriMatcher类用于匹配Uri

ContentUris

  • ContentUris类用于操作Uri路径后面的ID部分,它有1个比较实用的方法:
    withAppendedId(uri, id)用于为路径加上ID部分

通过ContentResolver得到数据

通过ContentObserver监听数据的改变

  1. 创建类继承contentObserver
  2. 重写onChange方法
  3. 注册内容观察者
  4. 反注册内容观察者
  5. 使用contentResolver发起数据的改变的信号

编写ContactProvider

  1. 创建contentProvider,配置
  2. 设计表字段
    1. _id:主键
    2. account:账号
    3. nickname:昵称
    4. avatar:头像
    5. pinyin:账号拼音
  3. 创建表
  4. 完成crud
  5. androidTest
  6. 使用cursorAdapter查询数据库显示数据
  7. 监听实时改变

RosterListener

    @Override
    public void entriesAdded(Collection<String> addresses) {// 增加
       //保存或更新
    }

    @Override
    public void entriesUpdated(Collection<String> addresses) {// 更新
        //保存或更新
    }

    @Override
    public void entriesDeleted(Collection<String> addresses) {// 删除
        //删除
    }

使用service完成Roster数据的同步.

因为service可以在后台运行,这样即使activity销毁也可以接受到roster的改变

  1. 创建服务
  2. 登录成功开启服务
  3. 服务里面同步roster数据到sqlite,以及监听监听roster的改变

是哟个service同步Roster数据好处

  1. fragment被销毁了.还可以监听花名册的改变
  2. 花名册获取和同步不用每次登陆都去操作,只需要操作一次
    1. 因为服务的OnCreate方法只有在创建服务的时候会调用,第二次启动服务,如果服务存在,是不会再走onCreate方法的,而是走onStartCommand方法

CursorAdapter

  • newView该函数第一次回调用后,如果数据增加后也会再调用,但是重绘是不会调用的。
    数据增加后,回调用该函数来生成与新增数据相对应的view。
  • bindView函数第一次回调用后,如果数据更新也会再调用,但重绘会再次调用的。

聊天

Message,Chat,ChatManager,MessageListener

  • 关键类

    1. Message:对消息的封装
    2. Chat:一次聊天,可以发送消息
    3. ChatManager:消息管理者
    4. MessageListener:消息的监听者
  • 开发步骤

      1. 响应点击事件
      1. 创建message
      1. 获取chatmanager
      1. 创建chat
      1. 发送消息,并且监听消息

创建SmsProvider

  • 为什么需要provider
    • 聊天记录需要存储起来.
    • 后面可以使用contentObserver监听会话信息的改变

SmsProvider开发步骤

  1. 创建provider 配置名字 authority urimather匹配地址
  2. 设计表结构
  3. 完成crud
  4. androidTest
  5. 使用cursorAdapter查询数据库显示数据
  6. 监听实时改变

SmsProvider 表结构

from_account
to_account
body
status
type
time
session_account

处理聊天记录

  1. 发送聊天信息的时候保存聊天信息
  2. 收到消息也要保存消息
  3. 使用cursorAdapter现实聊天记录

    1. 查询所有聊天信息–>升序排列
    2. 显示消息
    3. 发送或者接收消息,需要更新listview
    4. 发送或者接收消息,listview需要滚动

      if (adapter.getCursor().getCount() > 0) {
          mListView.setSelection(adapter.getCursor().getCount() - 1);
      }
      

聊天消息放到我们的service中

即使activity在后台还是可以收到消息.然后notification提示消息;
* 消息的发送放到service
* 消息的接收放到service
* 消息的保存放到service
* 消息的改变的contentObserver在chatActivity

如何调用service中的方法.

通过bindService绑定服务.因为我们服务已经创建,再绑定的,属于混合使用模式.所以这个时候ChatActivity销毁了.我们的服务不会销毁

回忆service三种启动模式

  • startService
  • bindService
  • startService->bindService

MessageListener,ChatManagerListener

  • MessageListener:创建会话的时候设置监听器.可以监听发送/接收消息,前提条件是必须先创建chat并且设置监听
  • ChatManagerListener:监听主动/被动创建chat,我们在这个时候绑定MessageListener就可以处理别人主动发来的消息;

完成会话列表.

  • 修改SmsProvider
  • 得到会话列表的cursor
  • 使用cursorAdapter显示数据
  • 使用ContentObserver监听最近一条消息.

viewpager中的孩子.

  • view
  • Fragment
  • Activity

#

  1. 发送消息
  2. 处理消息
  3. 创建对象
  4. 得到对象

你可能感兴趣的:(聊天)