2013-10-01 38 views
3

我在Android上有一個項目,它需要使用asmack庫來啓用實時聊天。asmack中的重新連接管理器

關鍵功能是重新連接機制,這意味着我的應用程序可以在互聯網連接丟失時自動重新連接。

這裏是我的代碼片段:

ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT); 
connConfig.setSASLAuthenticationEnabled(true); 
connConfig.setReconnectionAllowed(true); 
XMPPConnection connection = new XMPPConnection(connConfig); 

但我得到這個錯誤,每當我關掉然後打開無線上網:

10-01 21:43:26.942: W/System.err(13695): javax.net.ssl.SSLException: Write error: ssl=0x5a4ad348: I/O error during system call, Broken pipe 
10-01 21:43:27.002: W/System.err(13695): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_write(Native Method) 
10-01 21:43:27.012: W/System.err(13695): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLOutputStream.write(OpenSSLSocketImpl.java:693) 
10-01 21:43:27.012: W/System.err(13695): at java.io.OutputStreamWriter.flushBytes(OutputStreamWriter.java:167) 
10-01 21:43:27.012: W/System.err(13695): at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:158) 
10-01 21:43:27.012: W/System.err(13695): at java.io.BufferedWriter.flush(BufferedWriter.java:124) 
10-01 21:43:27.012: W/System.err(13695): at org.jivesoftware.smack.PacketWriter.writePackets(PacketWriter.java:210) 
10-01 21:43:27.012: W/System.err(13695): at org.jivesoftware.smack.PacketWriter.access$000(PacketWriter.java:42) 
10-01 21:43:27.012: W/System.err(13695): at org.jivesoftware.smack.PacketWriter$1.run(PacketWriter.java:78) 
10-01 21:43:27.092: W/System.err(13695): javax.net.ssl.SSLException: Read error: ssl=0x5a4ad348: I/O error during system call, Connection timed out 
10-01 21:43:27.092: W/System.err(13695): at org.apache.harmony.xnet.provider.jsse.NativeCrypto.SSL_read(Native Method) 
10-01 21:43:27.092: W/System.err(13695): at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl$SSLInputStream.read(OpenSSLSocketImpl.java:651) 
10-01 21:43:27.092: W/System.err(13695): at java.io.InputStreamReader.read(InputStreamReader.java:244) 
10-01 21:43:27.092: W/System.err(13695): at java.io.BufferedReader.read(BufferedReader.java:310) 
10-01 21:43:27.092: W/System.err(13695): at org.kxml2.io.KXmlParser.fillBuffer(KXmlParser.java:1496) 
10-01 21:43:27.092: W/System.err(13695): at org.kxml2.io.KXmlParser.peekType(KXmlParser.java:979) 
10-01 21:43:27.092: W/System.err(13695): at org.kxml2.io.KXmlParser.next(KXmlParser.java:346) 
10-01 21:43:27.092: W/System.err(13695): at org.kxml2.io.KXmlParser.next(KXmlParser.java:310) 
10-01 21:43:27.092: W/System.err(13695): at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:326) 
10-01 21:43:27.092: W/System.err(13695): at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44) 
10-01 21:43:27.092: W/System.err(13695): at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:71) 

任何人,誰可以解決這個錯誤,請幫幫我!

+1

請分享您正在使用的aSmack庫的版本。我正在使用asmack-android-18-0.8.9beta4.jar,使用上面的代碼片段,並且我沒有看到當我關閉Nexus3手機上的wifi時出現的錯誤。 –

+0

其實我不再使用asmack庫了:)。無論如何,非常感謝你! –

+0

我很好奇,你現在在用什麼? –

回答

-1

不要使用在ASMACK中實現的重新連接機制。

用途:

connConfig.setReconnectionAllowed(false); 

相反,你應該創建廣播接收器監聽到ConnectivityManager.CONNECTIVITY_ACTION。 當連接到WIFI或其他網絡時,您將在您的BroadcastReceiver中收到回調onReceive

+0

這種方式並不好。您可以檢查以下情況:您的智能手機連接到AP,如果AP失去互連(假設您從AP拔下有線電纜),在這種情況下,您的智能手機將無法實現互聯網連接的更改。 –

+0

@duong_dajgja你是對的,但是Asmack的重新連接管理器中存在一個錯誤。也許這個bug在最新版本中已經修復。而且,如果重新連接管理器是固定的,那麼您應該結合使用兩種技術,以便在沒有活動網絡時不嘗試重新連接。 當你打電話時它會發生: connection.connect(); – Eugene

0

Asmack正確支持重新連接,唯一的問題是,你正在使用SASL連接所以這是因爲你在轉彎再次嘗試同一連接的Wi-Fi off.Try用一套SASL假給人問題

connConfig.setSASLAuthenticationEnabled(false); 

需要其他明智斷開手動

connection.disconnect(); 
7

使用最新嫌API - 我使用4.1.0

然後設置重新連接象下面這樣:

ReconnectionManager manager = ReconnectionManager.getInstanceFor(connection); 
manager.enableAutomaticReconnection(); 

描述Here

+0

你知道嗎,如果你已經連接,你必須這樣做嗎?如果您在嘗試連接時沒有互聯網連接,您是否必須嘗試連接而無需重新連接管理器,否則它會自行完成連接? – Kasas

0

它會自動重新連接當設置在一開始的一切,從打電話然後創建了將自動重新連接

ReconnectionManager.setEnabledPerDefault(true); 

然後連接。