XMPP 一种基于标准通用标记语言的子集XML的协议,继承了在XML环境中灵活的发展性,XMPP的前身是Jabber,一个开源形式组织产生的网络即时通信协议。(from 百度)
XMPP中定义了三个角色,客户端,服务器,网关。通信能够在这三者的任意两个之间双向发生。服务器同时承担了客户端信息记录,连接管理和信息的路由功能。网关承担着与异构即时通信系统的互联互通,异构系统可以包括SMS(短信),MSN,ICQ等。基本的网络形式是单客户端通过TCP/IP连接到单服务器,然后在之上传输XML。(from 百度)
XMPP实现即时通讯通过Openfire + Spark搭建服务器。原理:userA和userB通过聊天服务器作为中介发送和接收消息,消息的以Xml格式传输
连接服务器及回执 发送消息的xml数据 初始化聊天配置openFire下载地址:http://www.igniterealtime.org/downloads/
登录连接,监听连接及消息conn.addConnectionListener(new ConnectionListener()); //监听连接
Roster好友花名册
roster.addRosterListener(new RosterListener()); //监听好友请求
roster.createEntry(friendJID, null, null); //申请加为好友
同意加为好友 拒绝加为好友ChatManager消息管理器
chatManager.addChatListener(new ChatManagerListener());//消息监听器,用于监听接收到的消息,消息以Xml格式,使用Xml解析
发送消息技术难点
①连接的保活。在手机端需要不断监听与服务器的连接,偶然情况会因为进程被无意杀掉,导致消息未能及时保存,在重启APP时出现消息漏收情况,这时候当APP运行作为后台进程运行时,登录状态设为离线,待下次重启APP时可接受到离线消息。
②消息的保存。因为是小作坊搭建的聊天服务器,在消息保存这一块没有做完善,因而聊天的历史纪录需要在APP本地搭建数据库保存历史聊天记录。当然,既然是自己的数据库了,在保存或取值是就可以随心所欲了。
③请求或消息重复发送。偶人会出现消息或者请求重复的情况,当用户编辑完消息点击发送,服务器有时会请求多次,导致对方接收多次。手机端需要限制发送消息的重复点击事件,避免同一消息发送多次;服务端设置请求不重复接收。
④异地登录。用户常常在多个手机登录同一个聊天账户,导致服务器茫然,消息发送不准确或消息到达目的地不当。
解决办法
第一步:手机端配置连接时将resoure统一设为“phone”,当用户在IOS或者Android同时登录时,聊天账号都能监听到异地登录。
统一设置登录源第二步:需要在增加连接监听器(addConnectionListener)时,在重写的connectionClosedOnError()方法中,识别Exception中是否包含conflict,有则当前账号表为异地登陆,即断开当前连接,使得后来登录的手机端正常连接。
监听到异地登录XMPP实现即时通讯通过Openfire + Spark搭建服务器,功能很强大,集成的方法很齐全,也提供了发送消息时增加自定义的节点方法,简单好用,但是缺点时在用户端和服务器交互偶尔出现的断连问题不好处理。
需要在正常连接状态下,消息进行握手,每条消息发给客户端,都需要客户端回复回执,否则一直保存在服务器,即客服端在每隔15s-60s发送一个message给服务器,服务器收到后回复一个callback,以此保证连接。如果服务器120s内没有收取到任何消息,那么close Session,断开连接。
下一篇:MVP+Okhttp3+Retrofit2+Rxjava2 框架初实现
惟吾德馨_慧 每天进步一点点 (2019-05-16)
网友评论