2013-03-25 2 views
51

저는 비교적 안드로이드 개발에 익숙합니다. 나는 웹 서버에 요청을 보내고 json 객체를 파싱하는 안드로이드 애플리케이션을 개발 중이다. 자주 나는 서버와 통신하는 동안 java.net.SocketTimeoutException: Connection timed out 예외를 얻고있다. 어떤 때는 문제없이 완벽하게 작동합니다. 나는이 동일한 질문이 여러 번 그렇게 요구되어 왔다는 것을 안다. 그러나 여전히 나는이 문제에 대한 만족스러운 해결책을 얻지 못했다. 아래에 내 logcat 및 app-server 통신 코드를 게시하고 있습니다.java.net.SocketTimeoutException가 발생했습니다 : 연결이 android에서 시간 초과되었습니다

public JSONObject RequestWithHttpUrlConn(String _url, String param){ 

    HttpURLConnection con = null; 
    URL url; 
    String response = ""; 
    Scanner inStream = null; 
    PrintWriter out = null; 
    try { 
     url = new URL(_url); 
     con = (HttpURLConnection) url.openConnection(); 
     con.setDoOutput(true); 
     con.setRequestMethod("POST"); 
     if(param != null){ 
      con.setFixedLengthStreamingMode(param.getBytes().length); 
     } 
     con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     out = new PrintWriter(con.getOutputStream()); 
     if(param != null){ 
      out.print(param); 
     } 
     out.flush(); 
     out.close(); 
     inStream = new Scanner(con.getInputStream()); 

     while(inStream.hasNextLine()){ 
      response+=(inStream.nextLine()); 
     } 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally{ 
     if(con != null){ 
      con.disconnect(); 
     }if(inStream != null){ 
      inStream.close(); 
     }if(out != null){ 
      out.flush(); 
      out.close(); 
     } 
    } 
} 

로그 캣 :

03-25 10:55:32.613: W/System.err(18868): java.net.SocketTimeoutException: Connection 
timed out 
03-25 10:55:32.617: W/System.err(18868):at org.apache.harmony.luni.platform.OSNetworkSystem.connect(Native Method) 
03-25 10:55:32.617: W/System.err(18868):at dalvik.system.BlockGuard 
$WrappedNetworkSystem.connect(BlockGuard.java:357) 
03-25 10:55:32.617: W/System.err(18868):at 
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:204) 
03-25 10:55:32.617: W/System.err(18868):at 
org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:437) 
03-25 10:55:32.617: W/System.err(18868):at  java.net.Socket.connect(Socket.java:1002) 
03-25 10:55:32.621: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init> 
(HttpConnection.java:75) 
03-25 10:55:32.621: W/System.err(18868): at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init> 
(HttpConnection.java:48)03-25 10:55:32.624: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection$Address.connect 
(HttpConnection.java:322)03-25 10:55:32.624: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get 
(HttpConnectionPool.java:89)03-25 10:55:32.628: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHttpCon 
nection(HttpURLConnectionImpl.java:285) 
03-25 10:55:32.628: W/System.err(18868):at  org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.makeConn 
ection(HttpURLConnectionImpl.java:267) 
03-25 10:55:32.636: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect 
(HttpURLConnectionImpl.java:205) 
03-25 10:55:32.636: W/System.err(18868):at 
org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getOutputS 
tream(HttpURLConnectionImpl.java:614) 
03-25 10:55:32.636: W/System.err(18868):at 
com.myapp.core.JSONRequest.RequestWithHttpUrlConn(JSONRequest.java:63) 
03-25 10:55:32.636: W/System.err(18868): at com.myapp.core.DetailPage 
$AsyncRecBooks.doInBackground(AKBookDetailView.java:265) 
03-25 10:55:32.640: W/System.err(18868): at com.myapp.core.DetailPage 
$AsyncRecBooks.doInBackground(AKBookDetailView.java:1) 
03-25 10:55:32.640: W/System.err(18868): at android.os.AsyncTask$2.call 
(AsyncTask.java:185) 
03-25 10:55:32.640: W/System.err(18868): at java.util.concurrent.FutureTask 
$Sync.innerRun(FutureTask.java:306) 
03-25 10:55:32.640: W/System.err(18868): at java.util.concurrent.FutureTask.run 
(FutureTask.java:138) 
03-25 10:55:32.640: W/System.err(18868): at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
03-25 10:55:32.648: W/System.err(18868): at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
03-25 10:55:32.648: W/System.err(18868): at java.lang.Thread.run(Thread.java:1019) 
03-25 10:55:32.652: E/JSON Parser(18868): Error parsing data org.json.JSONException: 
End of input at character 0 of 

사람이에 대한 해결책을 찾기 위해 나를 도울 수 있습니까? 덕분에 미리 ....

+1

나는 이것이 네트워크 문제라고 생각한다 – Pragnani

+1

나는 이것을 hispeed wi-fi에서 테스트했다 ... 여전히 자주 발생한다 ... – akh

+0

연결 시간 제한을 설정한다. – Raghunandan

답변

48

나는 웹상에서 검색하고 연결 시간 제한 예외에 관한 많은 문서를 읽은 후에, 내가 이해 한 것은 SocketTimeoutException을 방지하는 것이 한계를 넘었다는 것입니다 ... 효과적인 방법 중 하나는 그것을 처리하는 것은 연결 제한 시간을 정의하고 나중에 try catch 블록을 사용하여 처리하는 것입니다 ... 이것은 같은 문제를 겪고있는 미래의 누군가에게 도움이되기를 바랍니다.

HttpUrlConnection conn = (HttpURLConnection) url.openConnection(); 
conn.setConnectTimeout(7000); //set the timeout in milliseconds 
+15

시간 초과 기간 변경은 '처리'를 구성하지 않습니다. 예외를 잡아 내지 만, 당신은 이미 그것을하고있었습니다. 이 문제는 실제로 문제를 해결하지 못합니다. 프로그래밍 문제가 아니라 네트워크 연결 문제입니다. – EJP

+2

나는 이것이 100 % 네트워크 문제가 아니라 프로그래밍 문제에 동의합니다 ... '처리'는 충돌로부터 앱을 저장하는 것을 의미합니다 ... 내가 원할 때이 일이 발생하면 앱에서 나옵니다. .. 그리고 예외 잡기에 관한, 이전에 나는 SocketTimeoutException 잡을 수 없었다 ... 그래서 그 예외를 catch하고 응용 프로그램에서 나온. – akh

+0

내 연결 시간 및 readTimeOut이 '20 * 1000'으로 설정되었지만 여전히 SocketTimeOutException을 받고 있습니다! –

-3
public JSONObject RequestWithHttpUrlConn(String _url, String param){ 

    HttpURLConnection con = null; 
    URL url; 
    String response = ""; 
    Scanner inStream = null; 
    PrintWriter out = null; 
    try { 
     url = new URL(_url); 
     con = (HttpURLConnection) url.openConnection(); 
     con.setDoOutput(true); 
     con.setRequestMethod("POST"); 
     if(param != null){ 
      con.setFixedLengthStreamingMode(param.getBytes().length); 
     } 
     con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
     out = new PrintWriter(con.getOutputStream()); 
     if(param != null){ 
      out.print(param); 
     } 
     out.flush(); 
     out.close(); 
     inStream = new Scanner(con.getInputStream()); 

     while(inStream.hasNextLine()){ 
      response+=(inStream.nextLine()); 
     } 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } finally{ 
     if(con != null){ 
      con.disconnect(); 
     }if(inStream != null){ 
      inStream.close(); 
     }if(out != null){ 
      out.flush(); 
      out.close(); 
     } 
    } 
} 
16

나는이 질문은 조금 오래 알고 있어요. 그러나 연구를하면서 이것에 비틀 거리게 된 이후로 나는 약간의 도움이 도움이 될 것이라고 생각했습니다.

앞에서 설명한 것처럼 네트워크 관련 문제이므로 클라이언트에서 오류를 해결할 수 없습니다. 그러나 몇 번 연결을 다시 시도하면됩니다. 이 문제는 실제 문제가 해결 될 때까지 해결 방법으로 작동 할 수 있습니다.

for (int retries = 0; retries < 3; retries++) { 
    try { 
     final HttpClient client = createHttpClientWithDefaultSocketFactory(null, null); 
     final HttpResponse response = client.execute(get); 
     final int statusCode = response.getStatusLine().getStatusCode(); 
     if (statusCode != 200) { 
      throw new IllegalStateException("GET Request on '" + get.getURI().toString() + "' resulted in " + statusCode); 
     } else {     
      return response.getEntity(); 
     } 
    } catch (final java.net.SocketTimeoutException e) { 
     // connection timed out...let's try again     
    } 
} 

아마도 도움이 될 것입니다.

0

로컬 호스트에서 서버를 테스트하는 경우 Android 기기가 동일한 로컬 네트워크에 연결되어 있어야합니다. 그런 다음 APP에서 사용하는 서버 URL에 "localhost"마스크가 아닌 컴퓨터 IP 주소가 포함되어 있어야합니다.

관련 문제