2014-10-03 2 views
2

안드로이드 4.1.2와 4.2.2에서 간헐적 인 연결 문제가 발생하여 HTTP 스택이 완전히 시간 초과 된 것처럼 보입니다. (DNS 조회와 TCP/IP가 여전히 작동합니다. ADB 쉘을 사용하여 체크 할 수 있습니다.).안드로이드 HttpURLConnection 연결 타임 아웃

이러한 연결은 WiFi가 아닌 GPRS에서 실패합니다.

SHELL을 사용하여 netstat를 검사 할 때 연결이 SYN_SENT에서 대기하고있는 것을 볼 수 있으며 서버의 방화벽을 검사 할 때 SYN 요청에 응답했지만 실제로는 아무것도들을 수 없습니다. 장치. 이 정전 동안 모든 HTTP 트래픽이 장치에서 실패한 것처럼 보입니다. Exchange는 더 이상 작동하지 않으며 기기가 네트워크를보고하고 전화를 걸고받을 수있는 경우에도 일반 브라우저 (Firefox, Chrome)를 사용하여 페이지를 요청할 수 없습니다.

내 응용 프로그램은 HTTP 및 HTTPS를 통해 통신하며이 중단 중에 모두 실패합니다. POST와 내 JSON 웹 서비스에 GET, 요청이 중단 및 던져 :

이 문제는 내가 HttpURLConnection의와 함께 아래에 설정 한 시간 제한을 존중한다로 연결하는 데 않다면이 예상된다
java.net.SocketTimeoutException: failed to connect to mywebaddress.com/1.1.1.1 (port 443) after 10000ms 

.

내가 사용하는 코드는 다음과 같습니다 (Async 클래스에 있음). 이것은 메시지의 중요성에 따라 연결 루프에 포함되는 경우가 많습니다. 이것은 각 통화 사이에 15 초 간격으로 최대 3 회까지 호출 될 수 있습니다. 사람이 과거에 이것을 경험 한 경우

HttpURLConnection conn = null; 
BufferedReader reader = null; 

try 
{   
    // Uses ConnectivityManager.getActiveNetworkInfo() 
    // Returns true, the Android OS reports a connection 
    if(myApp.hasNetworkConnection) 
    { 
     conn = (HttpURLConnection)endpoint.openConnection(); 
     conn.setConnectTimeout(10000); 
     conn.setReadTimeout(20000); 

     reader = new BufferedReader(new InputStreamReader(conn.getInputStream())); 

     StringBuffer strResults = new StringBuffer(); 
     String strLine = ""; 

     while ((strLine = reader.readLine()) != null) 
     { 
      strResults.append(strLine); 
     } 

     log(strResults.toString()); 
    } 

} 
catch(Exception ex) 
{ 
    log(ex.getMessage()); 
} 
finally 
{ 
    if(reader != null) 
     try 
     { 
      reader.Close(); 
      reader = null; 
     } 
     catch(Exception ex) 
     { 
      ex.printStackTrace(); 
     } 

    if(connection != null) 
    { 
     connection.disconnect(); 
     connection = null; 
    } 
} 

나는 정기적으로 연결을 잘못된 접근 방식을 시도하고 연결 풀을 소진의 방법은있다 궁금하네요?

정기적으로 발생하는 연결은 연결을 일괄 적으로 (일괄 적으로) 수행하지 않습니다.

조금 더 많은 정보를 공유하기 만하면 정전을 경험할 때 netstat이 장치 (ADB 쉘)에 표시 한 것입니다. 두 개의 "ESTABLISHED"연결은 HTTP 요청이 아닌 TCP 연결입니다. 모바일에 신호가 있고 데이터 기호에 연결이 표시됩니다.

답변

0

SYN_SENT

그냥에서-경우이 문제가 다른 사람에 의해 경험, 내가 업데이트 거라 생각 했어요.

여기의 문제는 Android에서 발생하는 것이 아니라 애플리케이션에서 호출하는 웹 서비스입니다. JSON 웹 서비스를 호출 할 때 JSON 웹 서비스를 호출 할 때 예상보다 훨씬 오래 걸리고 (1 분 이상) 응답을 반환했으며 응답은 항상 200/OK였습니다.

요청으로 Android HTTP 스택을 포화 상태에 이르렀는데 결국에는 충분한 시간 내에 제거되지 않아 기기가 정지되었습니다.

연결 및 읽기 제한 시간을 "0"(무한)보다 적절한 값으로 설정하여 내 코드에 더 나은 내결함성을 추가했으며 장시간 실행되는 프로세스가 201/Accepted를 반환하도록 웹 서비스를 수정했습니다. 장치가 자신의 작업을 수행 할 수 있도록 상태를 유지합니다. 일단 서버 처리가 완료되면 다른 수단 (Google Cloud Message)으로 기기를 다시 호출합니다.

0
try this 

    try { 
    HttpURLConnection.setFollowRedirects(false); 
    HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection(); 
    con.setRequestMethod("HEAD"); 

    con.setConnectTimeout(5000); //set timeout to 5 seconds 

    return (con.getResponseCode() == HttpURLConnection.HTTP_OK); 
} catch (java.net.SocketTimeoutException e) { 
    return false; 
} catch (java.io.IOException e) { 
    return false; 
} 
+0

괜찮 으면 setFollowRedirects를 추가하는 목적은 무엇입니까? 현재 응답에서 서버가 어디에서나 리디렉션되는 것은 아닙니다. 또한 setRequestMethod는 상태 코드 만 반환합니다. 훨씬 더 효율적이지만 다른 이유가 있습니까? –

관련 문제