Android xmpp+openfire+smack 断线问题解决方案

       用smack库写Android端聊天的功能的同学可能都有一个困扰,就是应用切换到后台,或者锁屏一会儿,回来以后发现消息发不出去了,此时去openfire后台查看自己这个账号,显示是下线的,但是打断点,调用connection的isConnect方法,发现返回的竟然是true,也就是说没有办法主动判断自己是否在线,长链接是否依然存在。

      smack提供了reconnect的方法,用ReconnectedManager可以调用到,在官方文档上也可以查到。但是我调用过以后发现,还是会偶尔出现断线的情况,这样的产品没法上线,用户聊着聊着发现消息发不出去了,然后一看自己还有网,这肯定是要大发雷霆卸载app的。于是乎,自己想办法解决吧!

      解决方法1:定时一个任务,每隔30秒进行一次登录操作。优点:几乎可以完全避免莫名其妙的断线。缺点:登录之前首先要先disconnect,不然会抛出已经连接上异常。而且还要向服务器发送present协议告诉服务器你上线了。而这些上线和下线的协议,服务器会转发给所有的好友,移动端消耗流量,服务端消耗资源,不可取。

      解决方法2:整体的流程是,定时一个任务,每隔半分钟主动向服务器发送心跳包,如果发送之后一定时间内服务器没有回执,那么就认为掉线了,进行重连工作。优点:解决方法1的优点。缺点:避免了服务器和好友反复收到present协议的消息,节省了服务器的开销。我们可以主动的定时向服务器发送心跳包,为发送的这个心跳包协议指定一个id,当我们发送ping给服务器以后,理论上来说,立刻就可以收到服务器的反馈,即是告诉你服务器收到你的消息了,知道你还在线,不会踢掉你。其实socket底层检查链接是否存在也是通过心跳,只不过发送的是极小的心跳包。而xmpp也定义了这种心跳包的机制,发送的是协议,携带的是标签。而服务器收到这样的协议以后,也会发回来一个协议,属性中的type是result。我们利用socket底层的原理,照猫画虎写一个重连即可。

      需要注意的是,iq协议info/query,顾名思义,信息查询,因此可能会有其他的某些查询操作也是发送的iq协议,因此需要在接受节点消息的监听中增加心跳包的过滤器,用消息的id判断即可。

你可能感兴趣的:(Android提升,Android性能优化)