2013-03-25 4 views
51

Я относительно новичок в разработке Android. Я разрабатываю приложение для Android, где я отправляю запрос на веб-сервер и анализирует объекты json. Часто я получаю исключение java.net.SocketTimeoutException: Connection timed out при общении с сервером. Несколько раз он будет работать без проблем. Я знаю, что этот же вопрос был задан в SO много раз. Но все же я не получил удовлетворительного решения этой проблемы. Я размещаю свой код связи 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(); 
     } 
    } 
} 

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 

Может кто-нибудь помочь мне выяснить, решение для этого? Спасибо в Advance ....

+1

Я думаю, что это ваша сетевая проблема – Pragnani

+1

Я протестировал это на Wi-Fi с его спиной ... это часто происходит ... – akh

+0

установить таймаут соединения. – Raghunandan

ответ

48

Я искал по всему Интернету и после прочтения большого количества документов относительно исключения тайм-аута подключения, я понял, что предотвращение SocketTimeoutException выходит за пределы нашего предела ... Один из способов эффективного обрабатывайте его, чтобы определить тайм-аут соединения, а затем обработать его с помощью блока catch try ... надеюсь, что это поможет любому в будущем, кто сталкивается с той же проблемой.

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

Изменение периода ожидания не означает «обращение с ним». Захват исключения делает, но вы уже это делали. Ничто из этого не позволяет решить эту проблему, а это проблема сетевого подключения, а не проблема программирования. – EJP

+2

Я согласен, что это 100% проблема с сетью, а не проблема с программированием ... Посредством «обработки» я хочу сохранить приложение от сбоя ... Все, что я хочу, это выйти из приложения, когда это произойдет ... .. и в отношении обнаружения исключения, раньше я не ловил SocketTimeoutException ... Поэтому я поймаю это исключение и выхожу из приложения. – 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 должно быть подключено к той же локальной сети. Затем URL-адрес сервера, используемый вашим APP, должен содержать IP-адрес вашего компьютера, а не маску «localhost».

Смежные вопросы