1

그래서 저는 작동하지 않는 소켓 타임 아웃을 실행 중입니다. 나는 기존의 게시물에 주어진 모든 지시를 따랐지만 여전히 작동하지 않는다 (소켓 타임 아웃 예외를 결코 얻지 못한다). 여기 내 코드는 다음과 같습니다.안드로이드 - setSoTimeout이 작동하지 않습니다.

AsyncTask<String, Void, String> task = new AsyncTask<String, Void, String>() { 
    @Override 
    protected String doInBackground(String... params) { 
     String location = params[0]; 

     try { 
     HttpGet httpGet = new HttpGet(location); 
     HttpParams httpParameters = new BasicHttpParams(); 

     // Set the timeout in milliseconds until a connection is established. 
     // The default value is zero, that means the timeout is not used. 
     int timeoutConnection = 0; 
     HttpConnectionParams.setConnectionTimeout(httpParameters, 
       timeoutConnection); 

     // Set the default socket timeout (SO_TIMEOUT) 
     // in milliseconds which is the timeout for waiting for data. 
     int timeoutSocket = 2000; 
     HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

     DefaultHttpClient client = new DefaultHttpClient(httpParameters); 
     Log.d(this.getClass().getSimpleName(), "STARTING CLIENT!!! "); 
     HttpResponse response = client.execute(httpGet); 
     Log.d(this.getClass().getSimpleName(), "CLIENT CANCELLED!!! "); 

     if (statusLine.getStatusCode() == HttpStatus.SC_OK) { 
      ByteArrayOutputStream out = new ByteArrayOutputStream(); 
      response.getEntity().writeTo(out); 
      return new Scanner(out.toString()).useDelimiter("\\A").next(); 
     } else { 
      return ""; 
     } 
     } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
     } catch (URISyntaxException e) { 
     e.printStackTrace(); 
     return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     try { 
     // doStuff 
     } catch (Exception e) { 
     e.printStackTrace(); 
     } 
    } 
}; 
task.execute(location); 

그래서 2 초 후에 소켓 시간 초과 예외가 발생하지만 클라이언트는이를 무시하고 있습니다. 어떤 도움이 필요합니까? 그래서 여기에 모든 코드입니다


사전

에서

감사 :이 시간 제한이 설정되어 내 예에서

public void fetch(String location) {  
    AsyncTask<String, Void, String> task = new AsyncTask<String, Void, String>() { 
     @Override 
     protected String doInBackground(String... params) { 
      String location = params[0]; 

      try { 
       HttpGet httpGet = new HttpGet(location); 
       HttpParams httpParameters = new BasicHttpParams(); 
       // Set the timeout in milliseconds until a connection is established. 
       // The default value is zero, that means the timeout is not used. 
       int timeoutConnection = 0; 
       HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
       // Set the default socket timeout (SO_TIMEOUT) 
       // in milliseconds which is the timeout for waiting for data. 
       int timeoutSocket = 2000; 
       HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

       DefaultHttpClient client = new DefaultHttpClient(httpParameters); 
       Log.d(this.getClass().getSimpleName(), "STARTING CLIENT!!! "); 
       HttpResponse response = client.execute(httpGet); 
       Log.d(this.getClass().getSimpleName(), "CLIENT CANCELLED!!! "); 

       if (statusLine.getStatusCode() == HttpStatus.SC_OK) { 
        ByteArrayOutputStream out = new ByteArrayOutputStream(); 
        response.getEntity().writeTo(out); 
        return new Scanner(out.toString()).useDelimiter("\\A").next(); 
       } else { 
        return ""; 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
       return null; 
      } catch (URISyntaxException e) { 
       e.printStackTrace(); 
       return null; 
      } 
     } 

     @Override 
     protected void onPostExecute(String result) { 
      try { 
       //doStuff 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    }; 
    task.execute(location); 
} 

답변

0

. 접속의 타임 아웃은 「java.net.SocketTimeoutException : Socket is connected」를 슬로우 해, 소켓 타임 아웃은 「java.net.SocketTimeoutException : 작업의 타임 아웃」입니다.

HttpGet httpGet = new HttpGet(url); 
HttpParams httpParameters = new BasicHttpParams(); 
// Set the timeout in milliseconds until a connection is established. 
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000; 
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection); 
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data. 
int timeoutSocket = 5000; 
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket); 

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters); 
HttpResponse response = httpClient.execute(httpGet); 

당신이 함수 setParams를 사용할 수있는 기존 HttpClient를 (예를 들어, DefaultHttpClient 또는 AndroidHttpClient)의 매개 변수를 설정하려면

().

httpClient.setParams (httpParameters);

+1

변경된 사항 ... 이미 시도했습니다. – user1416721

+0

안녕하세요 @ user1416721 새 코드를 추가했습니다. 그것은 나를 위해 일하고있다. 나는 이틀 전에 사용했다. 잘 했어. 그것을 사용하고 저에게 알려주십시오. – itsrajesh4uguys

+1

아니요, 여전히 작동하지 않습니다. 클라이언트는 실행을 시작하고 5 초 이내에 끝나지 않으며 SocketTimeoutException도 발생하지 않습니다 ... 어쩌면 뭔가 할 일이 있습니다. AsyncTask처럼 doInBackground에서이 작업을 사용하고 있습니까? – user1416721

2

내가 다시 비슷한 문제가있는 동안. 나는 약간의 실험을했으며 에뮬레이터에서 앱을 실행했을 때 타임 아웃이 작동하지 않았고 실제 장치에서 실행했을 때 작동한다는 것을 알게되었습니다. DefaultHttpClient, HttpUrlConnectionAndroidHttpClient으로 테스트했는데 모두 세 가지 결과가 나타났습니다. 에뮬레이터에서 약 20 초 후에 IO 예외 (UnknownHostException)가 발생합니다. ,

:

인터넷 검색 다른 사람들이 또한 시간 제한 문제를보고 한 것으로 나타났다 그래서 나는 유일한 신뢰를 추측한다. 가능한 해결책은 스스로 시간 초과를 관리하는 것입니다.

0

참조 : https://stackoverflow.com/a/20031077/2609238

문제는 아파치 HTTP 클라이언트에있을 수 있습니다. HTTPCLIENT-1098을 참조하십시오. 4.1.2에서 수정되었습니다.

제한 시간 초과 예외는 로깅 목적으로 IP를 역순으로 시도합니다. 예외가 실제로 발생하기까지는 추가 시간이 필요합니다.