2013-03-25 16 views
51

Jestem względnie nowy w rozwoju Androida. Pracuję nad aplikacją na Androida, w której wysyłam żądanie do serwera WWW i parsuję obiekty json. Często otrzymuję wyjątek java.net.SocketTimeoutException: Connection timed out podczas komunikowania się z serwerem. Czasami zadziała idealnie bez problemu. Wiem, że to samo pytanie było zadawane w wielu przypadkach. Ale wciąż nie otrzymałem satysfakcjonującego rozwiązania tego problemu. Poniżej zamieszczam mój kod komunikacji logcat i serwera aplikacji.Uzyskiwanie wyjątku java.net.SocketTimeoutException: upłynął limit czasu połączenia w Androidzie

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(); 
     } 
    } 
} 

Logcat:

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 

Czy ktoś może mi pomóc, aby znaleźć rozwiązanie dla tego? Z góry dziękuję ....

+1

Myślę, że to twój problem z siecią. – Pragnani

+1

Przetestowałem to na wi-fi hispeed ... nadal to zdarza się często ... – akh

+0

ustawić limit czasu połączenia. – Raghunandan

Odpowiedz

48

Przeszukałem cały Internet i po przeczytaniu wielu dokumentów dotyczących wyjątku limitu czasu połączenia, zrozumiałem, że zapobieganie przekroczeniu limitu SocketTimeoutException ... Jednym ze sposobów na skuteczne obsłużyć to jest zdefiniowanie limitu czasu połączenia, a później obsługiwać go za pomocą próby catch catch .... mam nadzieję, że to pomoże każdemu w przyszłości, którzy stoją przed tym samym problemem.

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

Zmiana limitu czasu nie stanowi "obsługi". Łapie wyjątek, ale już to robiłeś. Nic z tego nie rozwiązuje problemu, który jest problemem z łącznością sieciową, a nie problemem programistycznym. – EJP

+2

Zgadzam się, że jest to problem z siecią w 100%, a nie programowaniem ... Przez "obsługę" mam na myśli uratowanie aplikacji przed awarią ... Wszystko, czego chcę, to wyjść z aplikacji, kiedy to się dzieje ... ..i dotyczące wychwytywania wyjątku, wcześniej nie byłem w stanie uchwycić wyjątku SocketTimeoutException ... Więc złapałem ten wyjątek i wyszedłem z aplikacji. – akh

+0

Mój czas połączenia i readTimeOut jest ustawiony na '20 * 1000', nadal pobiera wyjątek 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

jestem świadomy to pytanie jest nieco stary. Ale odkąd natknąłem się na to podczas badań, pomyślałem, że mały dodatek może być pomocny.

Jak stwierdzono, błąd nie może zostać rozwiązany przez klienta, ponieważ jest to problem związany z siecią. Możesz jednak spróbować ponownie połączyć kilka razy. Może to działać jako obejście, dopóki prawdziwy problem nie zostanie rozwiązany.

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     
    } 
} 

Może to pomaga komuś.

0

Jeśli testujesz serwer w localhost, twoje urządzenie z Androidem musi być podłączone do tej samej sieci lokalnej. Wtedy adres URL serwera używany przez twoją aplikację musi zawierać twój adres IP komputera, a nie maskę "localhost".

Powiązane problemy