2013-03-25 9 views
51

में कनेक्शन का समय समाप्त हो गया है, मैं एंड्रॉइड विकास के लिए अपेक्षाकृत नया हूं। मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जहां मैं वेब सर्वर से अनुरोध भेज रहा हूं और जेसन ऑब्जेक्ट्स को पार्स कर रहा हूं। सर्वर के साथ संचार करते समय अक्सर मुझे java.net.SocketTimeoutException: Connection timed out अपवाद मिल रहा है। कुछ बार यह किसी भी समस्या के बिना पूरी तरह से काम करेगा। मुझे पता है कि इस सवाल को कई बार पूछा गया है। लेकिन फिर भी मुझे इस समस्या का कोई संतोषजनक समाधान नहीं मिला। मैं नीचे अपना लॉगकैट और ऐप-सर्वर संचार कोड पोस्ट कर रहा हूं।java.net प्राप्त करना। सॉकेटटाइमआउट अपवाद: एंड्रॉइड

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 

किसी को भी मेरी मदद कर सकते बाहर इस के लिए एक समाधान पता लगाने के लिए? अग्रिम में धन्यवाद ....

+1

मुझे लगता है कि यह आपकी नेटवर्क समस्या है – Pragnani

+1

मैंने इसे एक हर्पीड वाई-फाई पर परीक्षण किया ... फिर भी यह अक्सर होता है ... – akh

+0

एक कनेक्शन टाइमआउट सेट करें। – Raghunandan

उत्तर

48

मैंने पूरे वेब पर खोज की है और कनेक्शन टाइमआउट अपवाद के बारे में बहुत सारे दस्तावेज़ पढ़ने के बाद, मुझे समझने वाली चीज़ यह है कि, सॉकेटटाइमआउट अपवाद को रोकने से हमारी सीमा से परे है ... प्रभावी ढंग से एक तरीका इसे संभालने के लिए एक कनेक्शन टाइमआउट को परिभाषित करना है और बाद में इसे कैच ब्लॉक का उपयोग करके इसे संभालना है .... उम्मीद है कि इससे भविष्य में किसी को भी मदद मिलेगी जो एक ही मुद्दे का सामना कर रहे हैं।

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

टाइमआउट अवधि को बदलना 'इसे संभालना' नहीं है। अपवाद को पकड़ना, लेकिन आप पहले से ही ऐसा कर रहे थे। इनमें से कोई भी वास्तव में समस्या हल नहीं करता है, जो नेटवर्क कनेक्टिविटी समस्या है, प्रोग्रामिंग समस्या नहीं है। – EJP

+2

मैं मानता हूं कि यह 100% नेटवर्क मुद्दा है, प्रोग्रामिंग समस्या नहीं है ... 'हैंडलिंग' से मेरा मतलब है कि ऐप को क्रैश से सहेजना है ... जब भी ऐसा होता है तो मैं ऐप से बाहर निकलना चाहता हूं .... .. और अपवाद को पकड़ने के संबंध में, पहले मैं सॉकेटटाइमआउट अपवाद नहीं पकड़ रहा था ... इसलिए मैं उस अपवाद को पकड़ता हूं और ऐप से बाहर आ जाता हूं। – akh

+0

मेरा कनेक्शन समय और रीडटाइम आउट '20 * 1000' पर सेट है, फिर भी सॉकेटटाइमऑट अपवाद प्राप्त हो रहा है! –

-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

यदि आप स्थानीयहोस्ट में सर्वर का परीक्षण कर रहे हैं तो आपका एंड्रॉइड डिवाइस उसी स्थानीय नेटवर्क से कनेक्ट होना चाहिए। फिर आपके एपीपी द्वारा उपयोग किए जाने वाले सर्वर यूआरएल में आपका कंप्यूटर आईपी पता शामिल होना चाहिए, न कि "लोकलहोस्ट" मास्क।

संबंधित मुद्दे