2012-12-24 38 views
10

काम नहीं करता है मैंने एक प्रोग्राम लिखा है जो यादृच्छिक प्रॉक्सी के माध्यम से किसी वेबसाइट पर एक प्रेस्प्लेप्लोकनेक्शन खोलता है। मेरा प्रेजेंटपुर्नल कनेक्शन को कॉन कहा जाता है। अब मुझे पता है कि उनमें से कुछ प्रॉक्सी बहुत धीमी हो सकती हैं, इसलिए मैंने conn.setConnectTimeout(40000) और conn.setReadTimeout(40000) के साथ 40000 मिलीसेकंड के कनेक्शन का टाइमआउट सेट कर दिया है।जावा HTTPUrlConnection टाइमआउट

ऐसा करने के बाद, मैं इस कोड है:

long diff = 0; 
    long starttime = 0; 
    long endtime = 0; 

    try 
    { 
     starttime = System.currentTimeMillis(); 
     conn.connect(); 

     endtime = System.currentTimeMillis(); 

     diff = endtime - starttime; 

     if (endtime <= starttime + conn.getConnectTimeout()) 
     { 
      //Trying to read sourecode 
      InputStreamReader isrConn = new InputStreamReader(conn.getInputStream()); 
      BufferedReader brConn = new BufferedReader(isrConn); 

      line = brConn.readLine(); 

      while (line != null) 
      { 

       response += line + "\t"; 
       try 
       { 
        line = brConn.readLine(); 
       } catch (IOException e) 
       { 
        printError("Reading sourcecode failed."); 
       } 

      } 
     } 
     else 
     { 
      response = "blabla."; 
     } 




    // If conn.connect failed 
    } catch (IOException e) 
    { 
     endtime = System.currentTimeMillis(); 
     diff = endtime - starttime; 

     response = "Message: "+e.getMessage() +" MyTimeout:"+ conn.getConnectTimeout() +" Actual time passed: "+ diff; 
       e.printStackTrace(); 


    } 

वहाँ कारणों क्यों कनेक्शन विफल हो सकता है, तो कई मामलों में मैं पिछले पकड़ने के ब्लॉक करने के लिए मिलता है और निम्न आउटपुट प्राप्त कर रहे हैं:


संदेश: कनेक्शन टाइम आउट हो: कनेक्ट MyTimeout: 40000 वास्तविक समय बीत: 21012

संदेश: कनेक्शन टाइम आउट हो: कनेक्ट MyTimeout: 40000 वास्तविक समय बीत: 21,016

संदेश: कनेक्शन टाइम आउट हो: कनेक्ट MyTimeout: 40000 वास्तविक समय बीत: 21010

संदेश: कनेक्शन टाइम आउट हो: कनेक्ट MyTimeout: 40000 वास्तविक समय बीत: 21009


तो मेरे सवाल का होगा : मैंने टाइमआउट को 40000 मिलीसेकंड पर सेट कर दिया है, लेकिन मुझे लगभग 21000 मिलीसेकंड के बाद "कनेक्शन का समय समाप्त हो गया है", क्या आप में से कोई भी जानता है कि ऐसा क्यों है?

संपादित करें: विंडोज 7 का उपयोग कर रहा हूं और अब मैंने कैच-ब्लॉक में e.printStackTrace() को जोड़ा है, जैसा टिप्पणियों में बताया गया है। अब तक धन्यवाद

java.net.ConnectException: Connection timed out: connect 
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source) 
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source) 
    at java.net.PlainSocketImpl.connect(Unknown Source) 
    at java.net.Socket.connect(Unknown Source) 
    at sun.net.NetworkClient.doConnect(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient$1.run(Unknown Source) 
    at sun.net.www.http.HttpClient$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.net.www.http.HttpClient.privilegedOpenServer(Unknown Source) 
    at sun.net.www.http.HttpClient.openServer(Unknown Source) 
    at sun.net.www.http.HttpClient.<init>(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.http.HttpClient.New(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(Unknown Source) 
    at TestThread.getSourcePage(TestThread.java:361) 
    at TestThread.aChecker(TestThread.java:216) 
    at TestThread.getNextProxy(TestThread.java:169) 
    at TestThread.getNextC(TestThread.java:157) 
    at TestThread.aChecker(TestThread.java:273) 
    at TestThread.getNextProxy(TestThread.java:169) 
    at TestThread.aChecker(TestThread.java:295) 
    at TestThread.getNextProxy(TestThread.java:169) 
    at TestThread.getNextC(TestThread.java:157) 
    at TestThread.run(TestThread.java:103) 
    at java.lang.Thread.run(Unknown Source) 

Message: Connection timed out: connect MyTimeout:40000 Actual time passed: 21015 
+3

कृपया उत्पादन के रूप में चिह्नित अवैध/नीचे और अपने खुद के संदेश के वास्तविक स्टैक ट्रेस पोस्ट के बजाय बेहतर है। –

+1

यह ओएस निर्भर हो सकता है, कृपया निर्दिष्ट करें कि कौन सा ओएस –

+0

ब्रायन रोच द्वारा उल्लिखित है, कृपया कैच ब्लॉक में 'e.printStackTrace()' से आउटपुट पोस्ट करें। –

उत्तर

6

मेरे अनुभव में, HttpUrlConnection नाम संकल्प के दौरान समय-समाप्त नहीं होगा: उत्पादन अब (उदाहरण) है। यदि आपके डिवाइस ने लक्ष्य पता कैश किया है, तो यह सही समय पर सही होगा।

परीक्षण उद्देश्यों के लिए अपने कोड में अपने आईपी पते का उपयोग करें।

यह आमतौर पर मोबाइल उपकरणों पर होता है। अपवाद पर

10

देखो तुम मिल गया:
सबसे बड़ी सुराग: आप java.net.ConnectException प्रति जावाडोक के रूप में हो रही है java.net.ConnectException का प्रतीक है कि कनेक्शन ऐसी कोई प्रक्रिया पोर्ट पर ध्यान दे रहा है जैसे कारणों के लिए दूर से इनकार कर दिया था।

public class ConnectException 
extends SocketException 

Signals that an error occurred while attempting to connect a socket to a remote address and port. 
Typically, the connection was refused remotely (e.g., no process is listening on the remote 
address/port) 

आप HttpUrlConnection में क्या कॉन्फ़िगर किया गया:
कनेक्शन के लिए समय समाप्त (यह देखते हुए कि दूरस्थ पोर्ट कनेक्शन स्वीकार करता है)। यदि कनेक्शन टाइमआउट समाप्त हो जाता है, तो आपको java.net.SocketTimeoutException मिलता है और java.net.ConnectException नहीं मिलता है।

तो, java.net.ConnectException का कारण क्या है?
मैं निम्नलिखित परीक्षण मामलों की कोशिश की:

+------------+------------+----------------+------------------+---------------------------------+ 
    | Valid Host | Valid Port | Valid Proxy IP | Valid Proxy Port | Exception      | 
    +------------+------------+----------------+------------------+---------------------------------+ 
#1 | yes  | yes  | -NA-   | -NA-    | -- none --      | 
#2 | yes  | no   | -NA-   | -NA-    | java.net.ConnectException  | 
    +------------+------------+----------------+------------------+---------------------------------+ 
#3 | yes  | yes  | yes   | yes    | -- none --      | 
#4 | yes  | no   | yes   | yes    | java.net.SocketTimeoutException | 
#5 | yes  | yes  | yes   | no    | java.net.ConnectException  | 
    +------------+------------+----------------+------------------+---------------------------------+ 
  • प्रकरण # 1, # 3 खुश पथ जिसमें सभी कॉन्फ़िगरेशन सही
  • हैं # 4 मामले में कर रहे हैं, हम एक java.net.SocketTimeoutException क्योंकि जावा प्रक्रिया मिल कनेक्शन स्थापित करने में सक्षम है (प्रॉक्सी पोर्ट पर), लेकिन लक्ष्य होस्ट के पोर्ट नंबर के रूप में पढ़ने के लिए कोई डेटा नहीं मिला है
  • मामले में # 2, # 5 हमें java.net.ConnectException मिलता है क्योंकि जिस पोर्ट पर जावा प्रक्रिया लिखने का प्रयास करती है/पढ़ा गया अमान्य
  • है
  • कनेक्शन टाइमआउट मान उन मामलों के लिए अच्छा नहीं है जहां पोर्ट पर कोई प्रक्रिया नहीं सुन रही है जिस पर जावा प्रक्रिया कनेक्ट करने का प्रयास कर रही है।

    • प्रॉक्सी से कनेक्ट करने की कोशिश कर रहे थे में से कुछ नीचे होना चाहिए: यह पहले टाइमआउट की समय सीमा समाप्त

    Message: Connection refused: connect MyTimeout:10000 Actual time passed: 6549 java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) .... ....

    निष्कर्ष तुम क्यों ConnectException मिलता है। इसलिए जावा प्रक्रिया फेंक दिया java.net.ConnectException

  • यह java.net.ConnectException पकड़ने और प्रॉक्सी