2016-07-15 5 views
0

Android에서 채팅 응용 프로그램을 만들고 Smack API (4.1.7)를 사용하여 채팅 서버에 통신했습니다. 나는 비행기 모드 또는 연결로 전환 한 경우의 안드로이드 장치에서SocketException - Smack에서 네트워크 연결을 끊는 중 4.1.7

SocketException이을 받고, 손실 된

이 내 연결 코드

W/AbstractXMPPConnection: Connection closed with error 
    java.net.SocketException: recvfrom failed: ETIMEDOUT (Connection timed out) 
    at libcore.io.IoBridge.maybeThrowAfterRecvfrom(IoBridge.java:592) 
    at libcore.io.IoBridge.recvfrom(IoBridge.java:556) 
    at java.net.PlainSocketImpl.read(PlainSocketImpl.java:485) 
    at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:37) 
    at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:237) 
    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(XMPPTCPConnection.java:1173) 
    at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader.access$300(XMPPTCPConnection.java:952) 
    at org.jivesoftware.smack.tcp.XMPPTCPConnection$PacketReader$1.run(XMPPTCPConnection.java:967) 
    at java.lang.Thread.run(Thread.java:818) 
    Caused by: android.system.ErrnoException: recvfrom failed: ETIMEDOUT (Connection timed out) 
    at libcore.io.Posix.recvfromBytes(Native Method) 
    at libcore.io.Posix.recvfrom(Posix.java:185) 
    at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:250) 
    at libcore.io.IoBridge.recvfrom(IoBridge.java:553) 

이 예외를 방지하기 위해 나를 인도 해주십시오

XMPPTCPConnectionConfiguration.Builder configBuilder = XMPPTCPConnectionConfiguration.builder(); 
configBuilder.setServiceName(UserController.getHost()); 
configBuilder.setHost(UserController.getHost()); 
configBuilder.setPort(UserController.getPort()); 
configBuilder.setSendPresence(true); 

configBuilder.setDebuggerEnabled(true); 
configBuilder.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled); 
connection = new XMPPTCPConnection(configBuilder.build()); 

// XMPP Connection Listener monitor 
connection.addConnectionListener(new ConnectionListener() { 
@Override 
public void connected(XMPPConnection connection) { 
    service.sendConnectionUpdate(WhatTimeGlobal.SERVER_CONNECTED); 
} 

@Override 
public void authenticated(XMPPConnection connection, boolean resumed) { 
    service.sendConnectionUpdate(WhatTimeGlobal.SERVER_CONNECTED); 
} 

@Override 
public void connectionClosed() { 

} 

@Override 
public void connectionClosedOnError(Exception e) { 
    if (CommonUtils.isInternetAvailable() && connection != null) { 
     XMPPService.getInstance().loginIntoServer(); 
    } 
} 

@Override 
public void reconnectionSuccessful() { 
    Log.i("", "Successfully reconnected to the XMPP server."); 
} 

@Override 
public void reconnectingIn(int seconds) { 
    Log.i("", "Reconnecting in " + seconds + " seconds."); 
} 

@Override 
public void reconnectionFailed(Exception e) { 
    XMPPService.getInstance().loginIntoServer(); 
} 
}); 

// Configure the Auth Mechanism - Current moment set it as PLAIN 
configureAuthMethod(); 
connection.setUseStreamManagement(true); 
XMPPTCPConnection.setUseStreamManagementResumptionDefault(true); 
XMPPTCPConnection.setUseStreamManagementDefault(true); 
connection.setPacketReplyTimeout(100000); 

Roster roster = Roster.getInstanceFor(connection); 
roster.setRosterLoadedAtLogin(false); 
connection.connect(); 

답변

1

이 예외를 방지 할 수 없습니다. 처리해야합니다 (예 : 다시 연결 예약).

+0

이 클래스에는 Re-Connection Manager가 이미 추가되었습니다. 그리고 자동으로 다시 연결됩니다. 그리고 나는 어떤 기능적 충돌도 발생할 수 있다고 생각했다. – Sujewan

관련 문제