【发布时间】:2016-09-05 16:45:35
【问题描述】:
我在 android 上使用 smack 4.1.7 作为我的 xmpp 库,并在我的服务器上使用 openfire。设备从飞行模式上线后,当我尝试强制重新连接时出现异常。在正常的工作流程中,我没有得到这个异常。我希望我的应用程序支持离线模式,因此我必须确保从离线模式平稳过渡到在线模式。我使用飞行模式来测试这个场景。
我正在使用重新连接管理器以 20 秒的固定延迟处理重新连接。我强制重新连接,因为如果用户已经在应用程序中,我不希望用户等待 20 秒重新连接 xmpp。这就是为什么我仅在应用程序处于后台时才依靠重新连接管理器重新连接的原因。我希望这有助于理解我在这里尝试做什么。
我正在发布在 android 上启用 Smack 调试模式的堆栈跟踪:
07-26 13:55:45.154 com.myapp.xmpptest I/XmppService: Network state changed. Network connected.
07-26 13:55:45.154 com.myapp.xmpptest I/XmppService: Before xmppConnection connect.....
07-26 13:55:45.174 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 14
07-26 13:55:45.324 com.myapp.xmpptest D/SMACK: SENT (0): <stream:stream xmlns='jabber:client' to='myapp.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='eaf60f002867230766bb74b4419dffca@myapp.com' xml:lang='en'>
07-26 13:55:45.404 com.myapp.xmpptest D/SMACK: RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="myapp.com" id="bde2ec9" xml:lang="en" version="1.0">
07-26 13:55:45.484 com.myapp.xmpptest D/SMACK: RECV (0): <stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanis ms></stream:features>
07-26 13:55:45.484 com.myapp.xmpptest D/SMACK: SENT (0): <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></starttls>
07-26 13:55:45.564 com.myapp.xmpptest D/SMACK: RECV (0): <proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
07-26 13:55:46.174 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 13
07-26 13:55:46.194 com.myapp.xmpptest D/SMACK: SENT (0): <stream:stream xmlns='jabber:client' to='myapp.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='eaf60f002867230766bb74b4419dffca@myapp.com' xml:lang='en'>
07-26 13:55:46.274 com.myapp.xmpptest D/SMACK: RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="myapp.com" id="bde2ec9" xml:lang="en" version="1.0"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanis ms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/></stream:features>
07-26 13:55:46.284 com.myapp.xmpptest D/xmppTest: XmppConnectionListener connectionConnected()
07-26 13:55:46.284 com.myapp.xmpptest D/SMACK: XMPPConnection connected (0)
07-26 13:55:46.284 com.myapp.xmpptest D/SMACK: SENT (0): <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>HJKSHGFJHJGKHDJHGJEHJKRHGJKFDHGhjshjkghruiehskrjgbjkeh5j4568o gjkfhdsgh589wwghjfdghsuHJKSHFIREHGHRUEIghgfhjdgsu87489YUFSfh483fhj==</auth>
07-26 13:55:47.174 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 12
07-26 13:55:47.174 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 0
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: org.jivesoftware.smack.SmackException$NoResponseException: No response received within reply timeout. Timeout was 5000ms (~5s). Used filter: No filter used or filter was 'null'.
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.SASLAuthentication.authenticate(SASLAuthentication.java: 250)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection.loginNonAnonymously(XMPPTCPConnect ion.java:374)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java :456)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java :414)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection.connectInternal(XMPPTCPConnection. java:863)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.connect(AbstractXMPPConnection.ja va:364)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at com.myapp.xmpp.XmppService.connectAndAuthenticate(XmppService.java:492)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at com.myapp.xmpp.XmppService$2.run(XmppService.java:195)
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: at java.lang.Thread.run(Thread.java:818)
07-26 13:55:51.293 com.myapp.xmpptest I/XmppService: Before xmppConnection login.....
07-26 13:55:51.293 com.myapp.xmpptest W/AbstractXMPPConnection: Connection closed with error
javax.net.ssl.SSLException: Read error: ssl=0x9abd4400: I/O error during system call, Connection timed out
at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketIm pl.java:753)
at java.io.InputStreamReader.read(InputStreamReader.java:231)
at java.io.BufferedReader.read(BufferedReader.java:325)
at org.jivesoftware.smack.util.ObservableReader.read(ObservableReader.java:41)
at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1515)
at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:992)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:349)
at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPC onnection.java:1173)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPCon nection.java:952)
at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnecti on.java:967)
at java.lang.Thread.run(Thread.java:818)
07-26 13:55:51.293 com.myapp.xmpptest D/xmppTest: XmppConnectionListener connectionClosedOnError()
07-26 13:55:51.293 com.myapp.xmpptest W/System.err: javax.net.ssl.SSLException: Read error: ssl=0x9abd4400: I/O error during system call, Connection timed out
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketIm pl.java:753)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.io.InputStreamReader.read(InputStreamReader.java:231)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.io.BufferedReader.read(BufferedReader.java:325)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.util.ObservableReader.read(ObservableReader.java:41)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1515)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:992)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.next(KXmlParser.java:349)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPC onnection.java:1173)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPCon nection.java:952)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnecti on.java:967)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.lang.Thread.run(Thread.java:818)
07-26 13:55:51.303 com.myapp.xmpptest D/SMACK: XMPPConnection closed due to an exception (0)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: javax.net.ssl.SSLException: Read error: ssl=0x9abd4400: I/O error during system call, Connection timed out
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at com.android.org.conscrypt.NativeCrypto.SSL_read(Native Method)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at com.android.org.conscrypt.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketIm pl.java:753)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.io.InputStreamReader.read(InputStreamReader.java:231)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.io.BufferedReader.read(BufferedReader.java:325)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.util.ObservableReader.read(ObservableReader.java:41)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1515)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:992)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.next(KXmlParser.java:349)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.parsePackets(XMPPTCPC onnection.java:1173)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPCon nection.java:952)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnecti on.java:967)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.lang.Thread.run(Thread.java:818)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: org.jivesoftware.smack.SmackException$NotConnectedException: Client is not, or no longer, connected.
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketWriter.throwNotConnectedExce ptionIfDoneAndResumptionNotPossible(XMPPTCPConnection.java:1248)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection.throwNotConnectedExceptionIfApprop riate(XMPPTCPConnection.java:345)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java :451)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java :414)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.ReconnectionManager$2.run(ReconnectionManager.java:248)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.lang.Thread.run(Thread.java:818)
07-26 13:55:51.303 com.myapp.xmpptest D/xmppTest: XmppConnectionListener reconnectionFailed()
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: org.jivesoftware.smack.SmackException$NotConnectedException: Client is not, or no longer, connected.
07-26 13:55:51.303 com.myapp.xmpptest D/SMACK: Reconnection failed due to an exception (0)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketWriter.throwNotConnectedExce ptionIfDoneAndResumptionNotPossible(XMPPTCPConnection.java:1248)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.SmackException$NotConnectedException: Client is not, or no longer, connected.
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketWriter.throwNotConnectedExce ptionIfDoneAndResumptionNotPossible(XMPPTCPConnection.java:1248)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.tcp.XMPPTCPConnection.throwNotConnectedExceptionIfApprop riate(XMPPTCPConnection.java:345)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java :451)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java :414)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.ReconnectionManager$2.run(ReconnectionManager.java:248)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.lang.Thread.run(Thread.java:818)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: org.jivesoftware.smack.tcp.XMPPTCPConnection.throwNotConnectedExceptionIfApprop riate(XMPPTCPConnection.java:345)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at org.jivesoftware.smack.AbstractXMPPConnection.login(AbstractXMPPConnection.java :451)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at com.myapp.xmpp.XmppService.connectAndAuthenticate(XmppService.java:538)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at com.myapp.xmpp.XmppService$2.run(XmppService.java:195)
07-26 13:55:51.303 com.myapp.xmpptest W/System.err: at java.lang.Thread.run(Thread.java:818)
07-26 13:55:52.303 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 19
07-26 13:55:53.303 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 18
07-26 13:55:54.303 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 17
07-26 13:55:55.303 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 16
07-26 13:55:56.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 15
07-26 13:55:57.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 14
07-26 13:55:58.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 13
07-26 13:55:59.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 12
07-26 13:56:00.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 11
07-26 13:56:01.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 10
07-26 13:56:02.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 9
07-26 13:56:03.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 8
07-26 13:56:04.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 7
07-26 13:56:05.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 6
07-26 13:56:06.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 5
07-26 13:56:07.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 4
07-26 13:56:08.323 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 3
07-26 13:56:09.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 2
07-26 13:56:10.313 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 1
07-26 13:56:11.323 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 0
07-26 13:56:11.323 com.myapp.xmpptest D/SMACK: XMPPConnection (0) will reconnect in 0
07-26 13:56:11.373 com.myapp.xmpptest D/SMACK: SENT (0): <stream:stream xmlns='jabber:client' to='myapp.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='eaf60f002867230766bb74b4419dffca@myapp.com' xml:lang='en'>
07-26 13:56:11.403 com.myapp.xmpptest D/SMACK: RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="myapp.com" id="8dbb465e" xml:lang="en" version="1.0">
07-26 13:56:11.433 com.myapp.xmpptest D/SMACK: RECV (0): <stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"><required/></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanis ms></stream:features>
07-26 13:56:11.443 com.myapp.xmpptest D/SMACK: SENT (0): <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'></starttls>
07-26 13:56:11.473 com.myapp.xmpptest D/SMACK: RECV (0): <proceed xmlns="urn:ietf:params:xml:ns:xmpp-tls"/>
07-26 13:56:11.963 com.myapp.xmpptest D/SMACK: SENT (0): <stream:stream xmlns='jabber:client' to='myapp.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='eaf60f002867230766bb74b4419dffca@myapp.com' xml:lang='en'>
07-26 13:56:12.003 com.myapp.xmpptest D/SMACK: RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="myapp.com" id="8dbb465e" xml:lang="en" version="1.0"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>PLAIN</mechanism></mechanis ms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/></stream:features>
07-26 13:56:12.003 com.myapp.xmpptest D/xmppTest: XmppConnectionListener connectionConnected()
07-26 13:56:12.003 com.myapp.xmpptest D/SMACK: XMPPConnection connected (0)
07-26 13:56:12.003 com.myapp.xmpptest D/SMACK: SENT (0): <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='PLAIN'>HJKSHGFJHJGKHDJHGJEHJKRHGJKFDHGhjshjkghruiehskrjgbjkeh5j4568o gjkfhdsgh589wwghjfdghsuHJKSHFIREHGHRUEIghgfhjdgsu87489YUFSfh483fhj==</auth>
07-26 13:56:12.223 com.myapp.xmpptest D/SMACK: RECV (0): <success xmlns="urn:ietf:params:xml:ns:xmpp-sasl"/>
07-26 13:56:12.223 com.myapp.xmpptest D/SMACK: SENT (0): <stream:stream xmlns='jabber:client' to='myapp.com' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='eaf60f002867230766bb74b4419dffca@myapp.com' id='8dbb465e' xml:lang='en'>
07-26 13:56:12.253 com.myapp.xmpptest D/SMACK: RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="myapp.com" id="8dbb465e" xml:lang="en" version="1.0"><stream:features><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"/><session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features>
07-26 13:56:12.253 com.myapp.xmpptest D/SMACK: SENT (0): <iq id='H0v5c-22' type='set'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><resource>d73d639de6435579</resource>< /bind></iq>
07-26 13:56:12.283 com.myapp.xmpptest D/SMACK: RECV (0): <iq type="result" id="H0v5c-22" to="myapp.com/8dbb465e"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>eaf60f002867230766bb74b4419dffca@myapp.com/d73d639de6435579</jid></bind></iq>
07-26 13:56:12.293 com.myapp.xmpptest D/SMACK: SENT (0): <iq id='H0v5c-24' type='set'><session xmlns='urn:ietf:params:xml:ns:xmpp-session'/></iq>
07-26 13:56:12.323 com.myapp.xmpptest D/SMACK: RECV (0): <iq type="result" id="H0v5c-24" to="eaf60f002867230766bb74b4419dffca@myapp.com/d73d639de6435579"/>
07-26 13:56:12.323 com.myapp.xmpptest D/SMACK: User logged (0):eaf60f002867230766bb74b4419dffca@myapp.com:5222/d73d639de6435579
07-26 13:56:12.323 com.myapp.xmpptest D/xmppTest: XmppConnectionListener authenticated(). resumed : false
07-26 13:56:12.323 com.myapp.xmpptest D/xmppTest: joining control room
07-26 13:56:12.323 com.myapp.xmpptest D/SMACK: XMPPConnection authenticated (0)
07-26 13:56:12.323 com.myapp.xmpptest D/xmppTest: XmppConnectionListener reconnectionSuccessful()
07-26 13:56:12.323 com.myapp.xmpptest D/SMACK: SENT (0): <presence id='H0v5c-26'><c xmlns='http://jabber.org/protocol/caps' hash='sha-1' node='http://www.igniterealtime.org/projects/smack' ver='zIfK69gJkJ5OCxMILmZOsZ9HBlU='/></presence>
07-26 13:56:12.323 com.myapp.xmpptest D/SMACK: SENT (0): <presenceto='controlroom@conference.myapp.com/eaf60f002867230766bb74b4419dffca@myapp.com' id='H0v5c-27' type='unavailable'></presence>
如果我从日志中理解正确,当设备从飞行模式连接到互联网时,我尝试在网络更改事件中立即重新连接时会出现异常。但是,它最终会通过重新连接管理器进行连接。我用来触发 xmpp 连接和登录的代码如下:
// The network monitor
private BroadcastReceiver networkMonitor = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (isOnline && !Utilities.isOnline(AbstractActivity.this)) {
isOnline = false;
} else if (!isOnline && Utilities.isOnline(AbstractActivity.this)) {
// Trigger only when going from offline to online
isOnline = Utilities.isOnline(AbstractActivity.this);
// Re-establish the xmpp connection if it was disconnected
if (isOnline ) {
connectAndAuthenticate();
}
}
}
};
public void connectAndAuthenticate() {
if(xmppConnection==null){
XMPPTCPConnectionConfiguration.Builder builder = XMPPTCPConnectionConfiguration.builder()
.setUsernameAndPassword(hashedUserName, getPassword())
.setServiceName(serviceName)
.setHost(getCoreServer())
.setSendPresence(true)
.setSecurityMode(ConnectionConfiguration.SecurityMode.required)
.setPort(Integer.parseInt(port))
.setResource(getDeviceID());
if (BuildConfig.DEBUG) {
builder.setDebuggerEnabled(true);
}
XMPPTCPConnectionConfiguration config = builder.build();
xmppConnection = new MVXMPPTCPConnection(config);
// Disable the roster
Roster.getInstanceFor(xmppConnection).setRosterLoadedAtLogin(false);
ReconnectionManager reconnectionManager = ReconnectionManager.getInstanceFor(xmppConnection);
reconnectionManager.enableAutomaticReconnection();
reconnectionManager.setReconnectionPolicy(ReconnectionManager.ReconnectionPolic y.FIXED_DELAY);
reconnectionManager.setFixedDelay(20);
PingManager pingManager = PingManager.getInstanceFor(xmppConnection);
pingManager.registerPingFailedListener(this);
pingManager.setPingInterval(60);
// Instantiates a ChatStateManager.
ChatStateManager.getInstance(xmppConnection);
}
// connect
try {
Log.i(TAG, "Before xmppConnection connect.....");
xmppConnection.connect();
Log.i(TAG, "After xmppConnection connect.....");
} catch (SmackException.AlreadyConnectedException e) {
e.printStackTrace();
} catch (SmackException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XMPPException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
// login
try {
Log.i(TAG, "Before xmppConnection login.....");
xmppConnection.login(hashedUserName, getPassword(), getDeviceID());
Log.i(TAG, "After xmppConnection login.....");
// return
} catch (SmackException.AlreadyLoggedInException e) {
e.printStackTrace();
} catch (SmackException.ConnectionException e) {
e.printStackTrace();
} catch (XMPPException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
我收到了很多这样的错误。任何人都可以在这里帮助我。我在谷歌上搜索了很多,几乎没有任何结果。我还在 Smack 支持社区发布了这个问题,但还没有收到任何人的回复。
PS:我已经用尽了我可以在正文部分添加的行数,所以我发布了 openfire 服务器日志作为答案,因为我不知道如何以正确的格式包含所有内容,而不会像这样破坏它们。对此我深表歉意。
【问题讨论】:
-
既然您使用了重新连接管理器,为什么您在连接更改时显式登录?重新连接管理器不会处理吗?
-
重新连接管理器将每 20 秒进行一次重新连接尝试。当用户在应用程序中时,我不希望用户等待 20 秒直到应用程序上线,所以我在收到 Internet 连接已建立的通知后立即尝试连接。我主要依靠重新连接管理器在应用程序处于后台时重新连接。谢谢。
标签: android xmpp openfire smack