解决androidpn服务器端掉线不会重连的问题
winktj 发布于 3个月前,共有 0 条评论
前面的一个项目里面用到了androidpn来做推送服务,众所周知androidpn这个项目还没成熟,还存在一点小bug。
我是从 https://github.com/dannytiehui/androidpn这里clone androidpn下来的,看说明已经解决了很多问题了。不过经过和服务器对接调试之后还是发现了存在客户端不会在服务端重启后,重新链接的问题。
google了一下,发现已经有兄弟提供了修正bug的办法。
里面提供的解决方法是
虽然我下载到的那个版本并不是上文所提到的,顺从他的思路或许就能解决问题。
androidpn出现这样的问题原因主要是因为PacketReader和PacketWriter里面对一些异常没有进行处理.
我是从 https://github.com/dannytiehui/androidpn这里clone androidpn下来的,看说明已经解决了很多问题了。不过经过和服务器对接调试之后还是发现了存在客户端不会在服务端重启后,重新链接的问题。
google了一下,发现已经有兄弟提供了修正bug的办法。
原文地址已经失效,以下是别人转的
http://topmanopensource.iteye.com/blog/1609214
里面提供的解决方法是
在org.androidpn.client.XmppManager的LoginTask方法中加了一行代码getConnection().startKeepAliveThread(xmppManager);跟踪进去发现是开启了一个线程发送心跳,当发送失败时捕获异常,客户端每隔一段时间进行重连。如上所说,在我添加 getConnection().startKeepAliveThread(xmppManager);之后的确是报错了,因为Xmppconnection里面没有这个方法,而文中所说的第二个版本我怎么找也没找到。(找到的同学能否发我一份?)
catch (SocketException e) { Log.e("PacketReader", e.toString()); connection.disconnect(); xmppManager.startReconnectionThread(); } catch (IOException e) { e.printStackTrace(); }
这样就达到了当与服务端失去连接时,客户端能够进行重新连接的效果。后来群里有朋友说在LoginTask方法中加入
getConnection().startKeepAliveThread(xmppManager); 编译就报错,那是因为他用的是第一个版本 ,所有请先下载第二个版本,第二个版本带大神精简过smack源码。 其实心跳机制在官方的asmack中就已经存在,并且在建立XmppConnection的时候就已经启动,但是遗憾的是asmack的开发人员并没有进行异常之后的重连
虽然我下载到的那个版本并不是上文所提到的,顺从他的思路或许就能解决问题。
androidpn出现这样的问题原因主要是因为PacketReader和PacketWriter里面对一些异常没有进行处理.
// Close the stream.
try {
writer.write("</stream:stream>");
writer.flush();
}
catch (Exception e) {
// Do nothing
}
finally {
try {
writer.close();
}
catch (Exception e) {
// Do nothing
}
}
解决思路是在LoginTask里面打开一个发送一个心跳包的线程,这个线程用于与检测与服务器的链接状况,当发生异常时,我们自己做重连的处理。
首先,在Xmmpmanager里面添加心跳包线程的内部类