Android XMPP实现即时通讯

XMPP 一种基于标准通用标记语言的子集XML的协议,继承了在XML环境中灵活的发展性,XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。(from 百度)

XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。(from 百度)

XMPP实现即时通讯通过Openfire + Spark搭建服务器。原理:userA和userB通过聊天服务器作为中介发送和接收消息,消息的以Xml格式传输

Android XMPP实现即时通讯_第1张图片
连接服务器及回执
Android XMPP实现即时通讯_第2张图片
发送消息的xml数据
Android XMPP实现即时通讯_第3张图片
初始化聊天配置

openFire下载地址:http://www.igniterealtime.org/downloads/

Android XMPP实现即时通讯_第4张图片
登录连接,监听连接及消息

conn.addConnectionListener(new ConnectionListener()); //监听连接

Roster好友花名册

roster.addRosterListener(new RosterListener());  //监听好友请求

roster.createEntry(friendJID, null, null);  //申请加为好友

Android XMPP实现即时通讯_第5张图片
同意加为好友
拒绝加为好友

ChatManager消息管理器

chatManager.addChatListener(new ChatManagerListener());//消息监听器,用于监听接收到的消息,消息以Xml格式,使用Xml解析

Android XMPP实现即时通讯_第6张图片
发送消息

技术难点

①连接的保活。在手机端需要不断监听与服务器的连接,偶然情况会因为进程被无意杀掉,导致消息未能及时保存,在重启APP时出现消息漏收情况,这时候当APP运行作为后台进程运行时,登录状态设为离线,待下次重启APP时可接受到离线消息。

②消息的保存。因为是小作坊搭建的聊天服务器,在消息保存这一块没有做完善,因而聊天的历史纪录需要在APP本地搭建数据库保存历史聊天记录。当然,既然是自己的数据库了,在保存或取值是就可以随心所欲了。

③请求或消息重复发送。偶人会出现消息或者请求重复的情况,当用户编辑完消息点击发送,服务器有时会请求多次,导致对方接收多次。手机端需要限制发送消息的重复点击事件,避免同一消息发送多次;服务端设置请求不重复接收。

④异地登录。用户常常在多个手机登录同一个聊天账户,导致服务器茫然,消息发送不准确或消息到达目的地不当。

解决办法

第一步:手机端配置连接时将resoure统一设为“phone”,当用户在IOS或者Android同时登录时,聊天账号都能监听到异地登录。

Android XMPP实现即时通讯_第7张图片
统一设置登录源

第二步:需要在增加连接监听器(addConnectionListener)时,在重写的connectionClosedOnError()方法中,识别Exception中是否包含conflict,有则当前账号表为异地登陆,即断开当前连接,使得后来登录的手机端正常连接。

Android XMPP实现即时通讯_第8张图片
监听到异地登录

XMPP实现即时通讯通过Openfire + Spark搭建服务器,功能很强大,集成的方法很齐全,也提供了发送消息时增加自定义的节点方法,简单好用,但是缺点时在用户端和服务器交互偶尔出现的断连问题不好处理。

需要在正常连接状态下,消息进行握手,每条消息发给客户端,都需要客户端回复回执,否则一直保存在服务器,即客服端在每隔15s-60s发送一个message给服务器,服务器收到后回复一个callback,以此保证连接。如果服务器120s内没有收取到任何消息,那么close Session,断开连接。

上一篇:Android GreenDao数据库

下一篇:MVP+Okhttp3+Retrofit2+Rxjava2 框架初实现

惟吾德馨_慧 每天进步一点点 (2019-05-16)

你可能感兴趣的:(Android XMPP实现即时通讯)