2013-10-01 3 views
3

나는 실시간 채팅을 가능하게하기 위해 asmack 라이브러리를 사용해야하는 Android 프로젝트가 있습니다.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 휴대 전화에서 Wi-Fi를 껐다 켤 때 오류가 표시되지 않습니다. –

+0

사실 저는 더 이상 asmack 라이브러리를 사용하지 않습니다. :) 어쨌든, 정말 고마워요! –

+0

궁금한데, 지금 무엇을 사용하고 계십니까? –

답변

-1

ASMACK에서 구현 된 재 연결 메커니즘을 사용하지 마십시오.

사용 :

connConfig.setReconnectionAllowed(false); 

대신, ConnectivityManager.CONNECTIVITY_ACTION 수신 브로드 캐스트 리시버를 만들어야합니다. WIFI 또는 다른 네트워크에 연결되면 BroadcastReceiver에 콜백 onReceive이 전송됩니다.

+0

이 방법은 좋지 않습니다. 이 상황에서 확인할 수 있습니다. 스마트 폰이 AP에 연결되면 AP에서 상호 연결이 끊어지면 AP에서 유선을 뽑습니다.이 경우 스마트 폰은 인터넷 연결 변경을 인식하지 못합니다. –

+0

@duong_dajgja 맞아.하지만 Asmack의 재 연결 관리자에게 버그가 있었다.이 버그는 최신 릴리스에서 수정되었을 수 있습니다. 또한 재 연결 관리자가 고정되어 있으면 활성 네트워크가 없을 때 다시 연결하지 않으려면 두 가지 기술을 결합해야합니다. 전화 할 때 발생합니까? connection.connect(); – Eugene

0

Asmack가 제대로 다시 연결을 지원하고, 유일한 문제는 당신은 너무 이것이 당신이 잘못된 설정 SASL와 와이파이 off.Try 턴에서 다시 동일한 연결을 시도하고 있기 때문에 대한 문제를주고있다 SASL 연결을 사용하고 있다는 점이다

connConfig.setSASLAuthenticationEnabled(false); 

필요한 다른 현명한 분리 수동

connection.disconnect(); 
7

최신 헤로인 API를 사용하여 - 나는 그런 다음 다시 연결을 아래와 같이 설정 4.1.0

을 사용하고 있습니다 :

+0

이미 연결되어있을 때해야하는지 알고 있습니까? 연결하려고 할 때 인터넷에 연결되어 있지 않은 경우 reconnectionmanager없이 연결을 시도해야합니까? 그렇지 않으면 자체적으로 연결을 시도합니까? – Kasas

0

Here 설명 된대로 시작시 모든 설정시 자동으로 다시 연결됩니다

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

, 자동으로 다시 연결됩니다에 다음에서 생성

다음
ReconnectionManager.setEnabledPerDefault(true); 

연결을 호출합니다.