基于XMPP协议的Android即时通信系

2023-10-26

       以前做过一个基于XMPP协议的聊天社交软件,总结了一下。发出来。

      设计基于开源的XMPP即时通信协议,采用CS体系结构,通过GPRS无线网络用TCP协议连接到服务器,以架设开源的Openfn'e服务器作为即时通讯平台。

         系统主要由以下部分组成:一是服务器,负责管理发出的连接或者与其他实体的会话,接收或转发XML(ExtensibleMarkup Language)流元素给授权的客户端、服务器等;二是客户终端。它与服务器相连,通过XMPP获得由服务器或任何其它相关的服务所提供的全部功能。三是协议网关。完成XMPP协议传输的信息与外部消息系统可识别信息间的翻译。再就是XMPP网络。实现各个服务器、客户端间的连接。系统采用客户端(Client)/服务端(Server)架构体系结构。

 

客户端:

        客户端基于Android平台进行开发。负责初始化通信过程,进行即时通信时,由客户端负责向服务器发起创建连接请求。系统通过GPRS无线网络与Internet网络建立连接,通过服务器实现与Android客户端的即时通信脚。


服务器端:

       服务器端则采用Openfire作为服务器。允许多个客户端同时登录并且并发的连接到一个服务器上。服务器对每个客户端的连接进行认证,对认证通过的客户端创建会话,客户端与服务器端之间的通信就在该会话的上下文中进行。

 

1.1服务器端设计(这块几乎可以说是有成品了。不用多纠结)

        androidpn服务器端是java语言实现的,基于openfire开源工程,Web部分采用的是spring框架,这一点与openfire是不同的。Androidpn服务器包含两个部分,一个是监听特定端口上的XMPP服务,负责与客户端的XMPPConnection类进行通信,作用是用户注册和身份认证,并发送推送通知消息。另外一部分是Web服务器,采用一个轻量级的HTTP服务器,负责接收用户的Web请求。

       主要的四个组成部分分别是SessionManager,Auth Manager,PresenceManager以及Notification ManagerSessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登录状态,NotificationManager负责实现服务器向客户端推送消息功能。

       系统客户端基于Android手机平台。采用XMPP作为即时通讯协议。XMPP是基于XML,实现任意两个网络终端准实时的交换结构化信息的通信协议。采用Android平台提供的XML解析包对XML进行解析。由于应用活动都运行于主线程。故用多线程技术来解决系统通讯问题。针对通信安全问题.系统的用户信息和聊天信息在客户端存储在Android平台自身所带的SQLite数据库中,多媒体文件和图片文件存储在Android平台虚拟文件存储设备SD Card中。

 

        通讯模块负责与服务器建立通讯旧。通过创建3个线程来进行处理。分别负责消息的发送、接收和心跳信息的发送;解析模块主要用来解析XML数据流。根据解析元素不同类型封装成不同的数据对象:数据模块定义整个客户端中大部分的数据类型和对象;应用模块包括即时通信、图片浏览和音乐播放。是客户端和用户交流的接口;加密模块对发送和接收的消息进行加解密。以确保通讯数据的安全。

 

系统的客户端分为5大模块进行设计开发,如图2所示。

       通讯模块负责与服务器建立通讯旧。通过创建3个线程来进行处理。分别负责消息的发送、接收和心跳信息的发送;解析模块主要用来解析XML数据流。根据解析元素不同类型封装成不同的数据对象:数据模块定义整个客户端中大部分的数据类型和对象;应用模块包括即时通信、图片浏览和音乐播放。是客户端和用户交流的接口;加密模块对发送和接收的消息进行加解密。以确保通讯数据的安全。

加密(首先将二进制码转换成BASE64码,在转换成BASE64码之后,再进行MD5加密,)

XMPP服务器之间、客户与服务器之间采用的是TCP连接罔。TCP提供一种瓦向连接、可靠的字节流服务。保持一个实时双向的传输通道。TCP将用户数据打包构成报文段。它发送数据后启动一个定时器,等待对端数据确认,另一端对收到的数据进行确认,对失序的数据重新排序,并丢弃重复数据;TCP提供端到端的流量控制。计算和验证一个强制性的端到端检验。但是GPRS网络对TCP链路存在一个限制。当TCP链路在长时间无有数据流量时。会自动降低此链路的优先级直至强制断开此链路。所以在应用中.采用发送心跳的方式来维持此链路。

 数据格式

        XMLXMPP系统架构的核心。它能表述几乎任何一种结构化数据。特别是XMPP利用XML数据流进行客户端一服务器端、服务器端一服务器端的通信。XML数据流一般是由客户端发起至服务端,XML数据流的有效时间直接与用户的在线会话有效时间相关联。

 协议消息格式

XMPP协议包括3个顶层XML元素:MessagePresenceIQmMessage用来表示传输的消息,当用户发送一条消息时。就会在流的上下文中插入一个Message元素,中间有用户发送的相关信息;Presence用来表示用户的状态。当用户改变自己的状态时。就会在数据流的上下文中插入一个Presence元素,用来表示用户现在的状态;IQ用来表示一种请求,响应机制,从一个实体发送请求,另外一个实体接受请求并响应。

后台Servic

从类的层次看这个结构比较简单,让其变得复杂的是,其里面有三个线程:主线程,进行Xmpp通信线程,连接出错重试线程。

对图说明:

  1. NotificationService里创建一个单线程,让其对服务器进行连接,由于使用Xmpp连接服务器要分为三步:连接,注册,登陆。所以用一个栈来保存要执行的Task任务(ConnectTaskRegisterTaskLoginTask),还后再按这个顺序进行执行。

  2. 连接Xmpp服务器的线程用的是Executors.newSingleThreadExecutor(),这个本身可以不停的submit任务。为什么还要自己用一个栈来保存Task

  3. 连接线程在连接,注册,登陆的过程中,都有可能出错,都可能会失败,这时我就要有一个重连的机制,在Androidpn里开了另外一个线程来进行重试,其重试不是每次都按多少秒来进行重试,而是有其自己的规则。 

  4. LoginTask里,如果登陆了服务器端,其就会注册一个监听器,用于监听服务器push的数据包(Packet),再通过发送广播的方式来通知要进行显示的程序。

  5. 在登陆服务器后,也有可能出错,所以在登陆后,会设置一个ConnectionListener,用于监听连接出错的时候,再合适重连线程,进行重连

  6. 在登陆过程中,有一种错误要单独处理,就是账号和密码无效的时候,这个时候其返回的状态码是401,这种情况应该把本地保存的帐号和密码都清掉,再重新进行连接,不然会永远都登陆不上服务器端。

由于该系统所有的功能实现都是基于网络间的XML流的通信,所以,需要有一个模块专门负责网络问通信和XML流的处理,主要功能包括服务器和客户端之问通信时TCP套接字的处理,XML流的解析、存储等功能。

数据模块负责XML流的解析和封装的XML模块,主要功能是:将XML流解析成java对象,将iava对象封装成XML流;

其流程是XMPP服务器接收到XML流之后,会有渎取器将其读取出来并将其作为入口参数传入XML解析器,XML解析器通过对其命名空间的解析,从而确定将剩余的XML元素解析出来并传入相应的;ava对象中,从而最终将XML转换成iava对象,然后将iava对象传入应用程序模块中,实现其请求完成的功能并返回iava对象,但是该iava对象不能在网络中直接传输,必须先转换成XML节,于是,该iava对象会被传入XML封装器中,被封装成XML节,通过XMPP服务器的发送端口发往目的节点。

java对象处理模块处理流程如下:当该模块接收到iava对象时,会先将该对象通过解密算法和解密密钥解密成base64码,然后f耳将base64码转换成二进制码,从而实现对java对象的解析。当完成业务逻辑处理后,该模块会将返回的java对象先由二进制码转换成base64码,然后用加密算法将其加密,这里的加密算法是由双方在建立会话时通过三次握手协议协商的。

XML节被封装成java对象后,必须被转发至订:确的模块中加以处理,这就要求有一个路由转发模块,如图33所示。该模块的实现原理是:在系统启动时加载该路由模块,从而在内存中创建了一块路由模块,记录了命名空和功能模块之间的对应关系,当iava对象被封装好之后,系统会读出其命名空间,再在路由表中查找其所对应的模块,从而动态地加载该模块,并将该java对象转发至该模块,从而实现路山转发的功能。



       需要客户端源码的朋友可以去我的资源里找,或者本博文系列的最后一篇有地址。服务端源码不能给,那是公司的东西,抱歉!不要再问了哈

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于XMPP协议的Android即时通信系 的相关文章

  • AppCompatActivity 中的 setListAdapter

    我有一个具有功能的程序listArray with extends AppCompatActivity但我的代码有错误 my code 新闻活动 public class NewsActivity extends AppCompatActi
  • Android Market 公司注册

    抱歉 这个问题与编程无关 但我无处可问 我在 android 帮助中心和支持中询问 但没有任何回应 在 Android Market 开设公司帐户需要什么 我希望我的公司被视为卖家 他们将如何验证公司的身份 我需要向市场提供哪些文件 Tha
  • Android 创建类似 iphone 的渐变

    我需要在我的 Android 应用程序中创建类似黑色 iphone 的渐变 请查看下图中顶部的黑色渐变 怎么做 谢谢 也许是这样的
  • 允许我的应用程序用户从单个帐户发布推文

    我有一个小应用程序 可以显示我的小国家 比利时的公共交通交通问题 例如 我在应用程序中创建了一个系统 允许用户在火车延误时警告所有人 我想做的是允许我信任的用户从我的帐户发布类似 用户 X 说 123456 号列车晚点 3 分钟 之类的推文
  • 如何在android中动态添加项目到listview

    有谁能够帮助我 我正在尝试在 Android 中创建一个 ListView 并且我正在尝试使用代码 不使用 XML 将项目加载到其中 这是我到目前为止的代码 tweetList ListView this findViewById R id
  • 缩放视图中的文本以适合?

    我不相信这存在 但想仔细检查一下 我想设置 TextView 的文本大小 使其适合给定宽度的单行 例子
  • 如何更改Android布局中XML片段元素的默认提示值

    默认提示值自动完成 https developers google com places android api autocomplete小部件是Search 如何将该值更改为不同的值String 尝试下面的代码 PlaceAutocomp
  • Android EditText 验证后更改焦点并在对话框中显示错误

    我有一个带有 3 个 EditText 字段的简单活动 用户 通行证 确认 在 用户 字段中输入内容并且该人在键盘上单击 下一步 后 我在那里有一个 setOnFocusChangeListener 来验证输入 如果验证失败 将打开一个对话
  • 聚合联系人会自动添加吗?

    您一定也在其他地方看到过这段代码 但显然这个异常没有答案 编辑 如果您来这里寻找通过 vcardio 恢复联系人的解决方案 这就是它 我在使用时得到了这个vCardIO http code google com p vcardio Andr
  • 当我们回来时,查看寻呼机片段状态寻呼机适配器出现白屏?

    我已经使用 FragmentStatePagerAdapter 使用视图分页器来加载片段 当我第一次来时 它会工作 但如果我从寻呼机适配器重定向到其他片段并返回 它将显示空白屏幕 fragment community xml
  • Android:随着设备移动在mapv2上绘制路径

    我正在制作一个应用程序 我必须在其中当我的设备移动时在地图上绘制路径 我搜索了我的教程但都显示在两点之间绘制路径但是我要当我的设备移动时绘制路径 任何有关此的帮助将不胜感激 当你的设备移动时 你的意思是什么 无论哪种方式 您都必须使用位置侦
  • Android 中识别点击的图像区域?

    有没有办法在 Android 应用程序中确定用户单击了 ImageView 的哪个区域 例如 x y 坐标 谢谢 查看运动事件 http developer android com intl de reference android vie
  • SQLite 和共享首选项的优缺点[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在 SQLite 数据库和共享首选项之间存储信息的良好机制是什么 为什么要使用共享偏好设置 为什么使用sqlite 我试图找出它们之间的区别 以
  • 来自公共字符串的 Android RSA 加密

    我正在开发一个 Android 应用程序 我希望用户能够使用其他人的公钥加密消息 系统将生成公钥 私钥对 然后可以将消息秘密发送给其他用户 我正在创建一个加密类 它将处理消息的加密 解密 不幸的是我遇到了一些问题 在这种方法中 我想传递用户
  • 如何让号码保持最新号码而不是回到默认号码?

    我的 TxnNo A0010001 来自 Unitcode A001 LastTxnNo 0001 这是我的按钮点击 Db Save setOnClickListener new View OnClickListener Override
  • Android - 具有自定义视图的 android.view.InflateException

    嗨 我不断收到此错误 它是第 9 行的 android view InflateException xml 这是我的 xml
  • TextView 用字母打乱了我的话

    我的要求 创建 传入气泡 其宽度按内容排列 最大宽度为 90 我有这个标记
  • 如何跟踪用户在我的 Android 应用程序上花费了多少时间?

    我想跟踪用户在我的 Android 应用程序上花费了多少时间 当用户在应用程序上处于活动状态时 我可以获取以小时为单位的时间吗 它会自动跟踪 Note 应用程序不在 Google Play 上 此代码将帮助您获取应用程序使用时间 long
  • Android Vector Drawable 不支持。如何修复它?

    尝试从 AndroidStudio 2 2 Ubuntu 14 04 的本地 svg 文件生成矢量资源时出现此错误 Could not generate a preview In icon svg ERROR line 6
  • 在所有布局方法之后调用哪个 Activity 方法?

    我需要做一些事情Activity调用所有布局方法后 所有Views 已就位并且Activity已准备好显示 哪种方法可以做到这一点 如果你想获得视图的宽度或其他东西 这应该有效 将其添加到您的 Activity 的 onCreate 中 V

随机推荐

  • openwrt编译问题:pip._vendor.urllib3.exceptions.ReadTimeoutError:

    在openwrt 编译的时候报 pip vendor urllib3 exceptions ReadTimeoutError HTTPSConnectionPool host files pythonhosted org port 443
  • HTTPS科普扫盲帖

    为什么需要https HTTP是明文传输的 也就意味着 介于发送端 接收端中间的任意节点都可以知道你们传输的内容是什么 这些节点可能是路由器 代理等 举个最常见的例子 用户登陆 用户输入账号 密码 采用HTTP的话 只要在代理服务器上做点手
  • Oracle创建用户、角色、授权、建表

    https www cnblogs com roger112 p 7685307 html oracle数据库的权限系统分为系统权限与对象权限 系统权限 database system privilege 可以让用户执行特定的命令集 例如
  • 学习自动化测试该怎么学?6个步骤轻松拿捏

    自动化测试作为脱离手工测试的基本核心内容 其重要性不言而喻了 而且我们来看近期大厂的一些招聘信息显示 基本上自动化测试是必备前提 没有这个基本就不用谈后面的问题了 下面我们通过联想集团的一个软件测试工程师的要求来聊一下具体要怎么学才能掌握这
  • 在stm32上对于火焰模块的应用分析

    在stm32上对于火焰模块的应用分析 一 火焰模块 接线说明 供电 3 3v G 接地 GND AO模拟输入 DO数字输出 以stm32f407举例说明 AO接入 PF7 DO接入 PA4 实际上也可以不接 因为本实例没用到 二 火焰模块的
  • 【matlab】norm的用方法

    matlab norm的用方法 从上面可以得到 对一个向量P 5 0 1 norm 就等于各项的平方和再开根号
  • JAVA和C++的几个主要不同点

    1 指针 JAVA语言让编程者无法找到指针来直接访问内存无指针 并且增添了自动的内存治理功能 从而有效地防止了c c 语言中指针操作失误 如野指针所造成的系统崩溃 但也不是说JAVA没有指针 虚拟机内部还是使用了指针 只是外人不得使用而已
  • 100天精通Python(数据分析篇)——第69天:Pandas常用数据筛选方法(between、isin、loc、iloc)

    文章目录 一 布尔索引 二 between 三 isin 1 单列筛选 2 多列筛选 3 通过字典的形式传递多个条件 4 删除异常值所在行 5 isnotin实现 四 loc iloc 重要 0 创建DataFrame 1 提取行数据 2
  • Jmeter(八) - 从入门到精通 - JMeter配置元件(详解教程)

    1 简介 JMeter配置元件可以用来初始化默认值和变量 读取文件数据 设置公共请求参数 赋予变量值等 以便后续采样器使用 将在其作用域的初始化阶段处理 配置元件 Config Element 提供对静态数据配置的支持 可以为取样器设置默认
  • Flutter之基本路由,命名路由跳转,返回上一页,替换路由和返回根路由——Flutter基础系列

    需求 今天为大家介绍一下Flutter是如何进行页面跳转 路由管理的 一 基本路由 1 基本路由使用 假设我们需要从A页面跳转到basic页面 则我们需要在A页面引入 import basic dart 然后在A页面通过以下方法跳转 Rai
  • C/C++指向二维数组的指针

    1 二维数组 设有整型二维数组a 3 4 如下 0 1 2 3 4 5 6 7 8 9 10 11 它的定义为 int a 3 4 0 1 2 3 4 5 6 7 8 9 10 11 设数组a的首地址为1000 各下标变量的首地址及其值如图
  • Spring 全家通之 SpringMVC 如何传递参数以及返回值的类型

    大家好 我是你们的老朋友 Java 学术趴 最近小编又在整了 Spring 全家桶笔记 笔记会每天定时的进行发放 喜欢的大佬们欢迎收藏点赞关注呦 小编会每天分享的呦 今天给大家带来新的框架技术 SpringMVC Spring MVC 属于
  • 带你全面了解自动化测试框架—从理论到工具

    软件行业正迈向自主 快速 高效的未来 为了跟上这个高速前进的生态系统的步伐 必须加快应用程序的交付时间 但不能以牺牲质量为代价 快速实现质量是必要的 因此质量保证得到了很多关注 为了满足卓越的质量和更快的上市时间的需求 自动化测试将被优先考
  • 这张磁盘有写保护_win10 移动硬盘或U盘清除“被写保护”

    Win10系统取消移动硬盘写保护的方法 呃 这是别人写得不错的文章 我转载一下 发布时间 2016 12 20 发布者 win7之家 慧歌 浏览数 1089 移动硬盘是我们经常会用到的一个存储设备 在使用过程中难免会碰到一些情况 就有用户升
  • 【置顶】Flutter系列、Python系列目录

    Flutter系列 Flutter 1 1 8个Flutter的优势以及为什么要在下一个项目中尝试Flutter Flutter安装与运行 Flutter1 2 在 Windows 10下配置Flutter开发环境 Flutter1 3 在
  • 读书笔记 摘自:《分享经济的爆发》

    读书笔记 摘自 分享经济的爆发 作者 印 阿鲁 萨丹拉彻 赞 誉 创新的实验性与监管的连续性本身存在矛盾 监管者通常需要通过更新现有法律体系使其与创新性服务相适应 否则就会阻碍创新 将分享经济看作市场经济和礼物经济的 过渡态 资本主义和社会
  • 20171010离线赛总结

    题解 第一题 字符连通块 这道题还是比较好想的 首先把每个连通块标记出来 并用第一次扫到的点标记为这个连通块的父节点 接下来要做的就是把一个 周围的连通块连通起来 不过要注意一点 在连通标记的时候不要用memset memset的复杂度是m
  • Windows端CUDA11.3+CUDNN+pytorch环境搭建

    1 显卡驱动的安装 最近 在学习pytorch深度学习 遇到很多的坑 环境配置也出现过问题 忍不住和大家进行分享 现在把环境搭建过程分享给大家 1 1 查看自己的显卡 具体操作 我的电脑 属性 设备管理器 显示适配器 1 2 驱动的下载 安
  • (c语言实现)算法笔记之bfs及pta习题

    目录 一 bfs 广度优先搜索 的定义 二 bfs 广度优先搜索 的应用 三 题型训练 1 奇怪的电梯 2 寻宝 3 龙舌兰酒吧 四 总结 一 bfs 广度优先搜索 的定义 BFS 全称是 Breadth First Search 中文名是
  • 基于XMPP协议的Android即时通信系

    以前做过一个基于XMPP协议的聊天社交软件 总结了一下 发出来 设计基于开源的XMPP即时通信协议 采用C S体系结构 通过GPRS无线网络用TCP协议连接到服务器 以架设开源的Openfn e服务器作为即时通讯平台 系统主要由以下部分组成