2013-03-25 49 views
51

Tôi tương đối mới đối với việc phát triển Android. Tôi đang phát triển một ứng dụng Android, nơi tôi đang gửi yêu cầu đến máy chủ web và phân tích các đối tượng json. Thường xuyên tôi nhận được java.net.SocketTimeoutException: Connection timed out ngoại lệ trong khi giao tiếp với máy chủ. Một số lần nó sẽ làm việc hoàn hảo mà không có bất kỳ vấn đề. Tôi biết câu hỏi tương tự này đã được hỏi trong SO nhiều lần. Nhưng tôi vẫn không nhận được bất kỳ giải pháp thỏa mãn nào cho vấn đề này. Tôi đang đăng mã giao tiếp đăng nhập và máy chủ ứng dụng-máy chủ của mình bên dưới.Nhận java.net.SocketTimeoutException: Kết nối hết thời gian trong 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 

bất cứ ai có thể giúp tôi ra để tìm ra một giải pháp cho việc này? Cảm ơn trước ....

+1

Tôi nghĩ rằng đây là sự cố mạng của bạn – Pragnani

+1

Tôi đã thử nghiệm điều này trên Wi-Fi tốc độ ... vẫn xảy ra thường xuyên ... – akh

+0

đặt thời gian chờ kết nối. – Raghunandan

Trả lời

48

Tôi đã tìm kiếm trên web và sau khi đọc rất nhiều tài liệu về ngoại lệ kết nối thời gian chờ, điều tôi hiểu là ngăn ngừa SocketTimeoutException vượt quá giới hạn của chúng tôi ... Một cách hiệu quả xử lý nó là để xác định một thời gian chờ kết nối và sau đó xử lý nó bằng cách sử dụng một khối try catch .... hy vọng điều này sẽ giúp bất cứ ai trong tương lai những người đang phải đối mặt với cùng một vấn đề.

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

Thay đổi khoảng thời gian chờ không cấu thành 'xử lý'. Bắt ngoại lệ, nhưng bạn đã làm điều đó. Không có điều nào thực sự giải quyết được vấn đề, đó là vấn đề kết nối mạng, không phải là vấn đề lập trình. – EJP

+2

tôi đồng ý rằng đây là vấn đề mạng 100%, không phải là vấn đề lập trình ... Bằng cách 'xử lý' tôi muốn lưu ứng dụng khỏi sự cố ... Tất cả những gì tôi muốn là thoát khỏi ứng dụng khi điều này xảy ra .... ..và liên quan đến việc bắt các ngoại lệ, trước đó tôi đã không bắt được SocketTimeoutException ... Vì vậy, tôi bắt ngoại lệ đó và đi ra khỏi ứng dụng. – akh

+0

Thời gian kết nối của tôi & readTimeOut được đặt thành '20 * 1000', Vẫn nhận được 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

Tôi biết câu hỏi này là một chút cũ. Nhưng kể từ khi tôi vấp phải điều này trong khi làm nghiên cứu, tôi nghĩ một chút bổ sung có thể hữu ích.

Như đã nêu lỗi không thể được giải quyết bởi khách hàng, vì đó là một vấn đề liên quan đến mạng. Tuy nhiên, những gì bạn có thể làm là thử kết nối lại một vài lần. Điều này có thể hoạt động như một giải pháp cho đến khi vấn đề thực sự được khắc phục.

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

Có thể điều này sẽ giúp ai đó.

0

Nếu bạn đang kiểm tra máy chủ trong máy chủ cục bộ, thiết bị Android của bạn phải được kết nối với cùng một mạng cục bộ. Sau đó, URL máy chủ được sử dụng bởi APP của bạn phải bao gồm Địa chỉ IP máy tính của bạn chứ không phải mặt nạ "localhost".

Các vấn đề liên quan