जावा में एंड्रॉइड के लिए HttpResponse टाइमआउट कैसे सेट करें


333

मैंने कनेक्शन स्थिति की जाँच के लिए निम्नलिखित फ़ंक्शन बनाया है:

private void checkConnectionStatus() {
    HttpClient httpClient = new DefaultHttpClient();

    try {
      String url = "http://xxx.xxx.xxx.xxx:8000/GaitLink/"
                   + strSessionString + "/ConnectionStatus";
      Log.d("phobos", "performing get " + url);
      HttpGet method = new HttpGet(new URI(url));
      HttpResponse response = httpClient.execute(method);

      if (response != null) {
        String result = getResponse(response.getEntity());
        ...

जब मैं निष्पादन के परीक्षण के लिए सर्वर को बंद कर देता हूं तो लाइन में लंबे समय तक इंतजार करना पड़ता है

HttpResponse response = httpClient.execute(method);

क्या किसी को पता है कि बहुत लंबे समय तक इंतजार करने से बचने के लिए टाइमआउट कैसे सेट करें?

धन्यवाद!

जवाबों:


625

मेरे उदाहरण में, दो टाइमआउट सेट किए गए हैं। कनेक्शन टाइमआउट फेंकता है java.net.SocketTimeoutException: Socket is not connectedऔर सॉकेट टाइमआउट java.net.SocketTimeoutException: The operation timed out

HttpGet httpGet = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(httpGet);

यदि आप किसी भी मौजूदा HTTPClient (जैसे DefaultHttpClient या AndroidHttpClient) के पैरामीटर सेट करना चाहते हैं, तो आप फ़ंक्शन सेटपराम () का उपयोग कर सकते हैं ।

httpClient.setParams(httpParameters);

1
@ थोमस: मैंने अपना उत्तर आपके usecase के समाधान के साथ संपादित किया है
kuester2000

3
यदि कनेक्शन समय समाप्त हो जाता है तो HttpResponse क्या लौटेगा? फिलहाल जब मेरा HTTP अनुरोध किया जाता है, तो मैं कॉल लौटने पर स्थिति कोड की जांच करता हूं, हालांकि मुझे इस कोड की जांच करते समय एक NullPointerException मिलती है यदि कॉल समाप्त हो गई है ... मूल रूप से, मैं कॉल को कॉल करते समय स्थिति को कैसे संभाल सकता हूं समय समाप्त होता है? (मैं दिए गए आपके उत्तर के लिए बहुत समान कोड का उपयोग कर रहा हूं)
टिम

10
@ जेलीफ़िश - प्रलेखन के बावजूद, AndroidHttpClient DefaultHttpClient का विस्तार नहीं करता है ; बल्कि, यह HttpClient को लागू करता है। आपको SetParams (HttpParams) विधि उपलब्ध होने के लिए DefaultHttpClient का उपयोग करने की आवश्यकता होगी।
टेड होप

3
हे दोस्तों, उत्कृष्ट उत्तर के लिए टी हैंक्स। लेकिन, मैं कनेक्शन टाइमआउट पर उपयोगकर्ताओं को एक टोस्ट दिखाना चाहूंगा ... किसी भी तरह से मैं यह पता लगा सकता हूं कि कनेक्शन का समय कब खत्म होगा?
अर्णब चक्रवर्ती

2
काम नहीं करता है। मैंने अपने Sony और Moto पर परीक्षण किया, वे सभी टक हो गए।
thecr0w

13

क्लाइंट पर सेटिंग्स सेट करने के लिए:

AndroidHttpClient client = AndroidHttpClient.newInstance("Awesome User Agent V/1.0");
HttpConnectionParams.setConnectionTimeout(client.getParams(), 3000);
HttpConnectionParams.setSoTimeout(client.getParams(), 5000);

मैंने इसे जेलीबीन पर सफलतापूर्वक उपयोग किया है, लेकिन पुराने प्लेटफार्मों के लिए भी काम करना चाहिए ...।

HTH


HttpClient के साथ क्या संबंध है?
सज्जाद हिसैन खान

8

यदि आप जकार्ता के http क्लाइंट लाइब्रेरी का उपयोग कर रहे हैं तो आप कुछ ऐसा कर सकते हैं:

        HttpClient client = new HttpClient();
        client.getParams().setParameter(HttpClientParams.CONNECTION_MANAGER_TIMEOUT, new Long(5000));
        client.getParams().setParameter(HttpClientParams.SO_TIMEOUT, new Integer(5000));
        GetMethod method = new GetMethod("http://www.yoururl.com");
        method.getParams().setParameter(HttpMethodParams.SO_TIMEOUT, new Integer(5000));
        method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
        int statuscode = client.executeMethod(method);

5
HttpClientParams.CONNECTION_MANAGER_TIMEOUT अज्ञात है
तवानी

आपको * _TIMEOUT params
loafoe

कैसे ढूंढें? डिवाइस वाईफाई से जुड़ा है लेकिन वास्तव में सक्रिय डेटा वाईफाई के माध्यम से नहीं मिल रहा है।
गणेश कटिकर

7

यदि आप डिफ़ॉल्ट http क्लाइंट का उपयोग कर रहे हैं, तो यहां डिफ़ॉल्ट http params का उपयोग कैसे किया जाए:

HttpClient client = new DefaultHttpClient();
HttpParams params = client.getParams();
HttpConnectionParams.setConnectionTimeout(params, 3000);
HttpConnectionParams.setSoTimeout(params, 3000);

मूल क्रेडिट http://www.jayway.com/2009/03/17/configuring-timeout-with-apache-httpclient-40/ पर जाता है


5

उन लोगों के लिए जो यह कहते हैं कि @ kuester2000 का जवाब काम नहीं करता है, कृपया ध्यान रखें कि HTTP अनुरोध, पहले DNS अनुरोध के साथ होस्ट आईपी को खोजने का प्रयास करें और फिर सर्वर से वास्तविक HTTP अनुरोध करें, इसलिए आपको एक सेट करने की भी आवश्यकता हो सकती है DNS अनुरोध के लिए समय समाप्त।

यदि आपके कोड ने DNS अनुरोध के लिए टाइमआउट के बिना काम किया है तो यह इसलिए है क्योंकि आप DNS सर्वर तक पहुंचने में सक्षम हैं या आप Android DNS कैश को मार रहे हैं। वैसे आप डिवाइस को पुनरारंभ करके इस कैश को साफ़ कर सकते हैं।

यह कोड कस्टम टाइमआउट के साथ मैन्युअल DNS लुकअप को शामिल करने के लिए मूल उत्तर का विस्तार करता है:

//Our objective
String sURL = "http://www.google.com/";
int DNSTimeout = 1000;
int HTTPTimeout = 2000;

//Get the IP of the Host
URL url= null;
try {
     url = ResolveHostIP(sURL,DNSTimeout);
} catch (MalformedURLException e) {
    Log.d("INFO",e.getMessage());
}

if(url==null){
    //the DNS lookup timed out or failed.
}

//Build the request parameters
HttpParams params = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(params, HTTPTimeout);
HttpConnectionParams.setSoTimeout(params, HTTPTimeout);

DefaultHttpClient client = new DefaultHttpClient(params);

HttpResponse httpResponse;
String text;
try {
    //Execute the request (here it blocks the execution until finished or a timeout)
    httpResponse = client.execute(new HttpGet(url.toString()));
} catch (IOException e) {
    //If you hit this probably the connection timed out
    Log.d("INFO",e.getMessage());
}

//If you get here everything went OK so check response code, body or whatever

इस्तेमाल किया विधि:

//Run the DNS lookup manually to be able to time it out.
public static URL ResolveHostIP (String sURL, int timeout) throws MalformedURLException {
    URL url= new URL(sURL);
    //Resolve the host IP on a new thread
    DNSResolver dnsRes = new DNSResolver(url.getHost());
    Thread t = new Thread(dnsRes);
    t.start();
    //Join the thread for some time
    try {
        t.join(timeout);
    } catch (InterruptedException e) {
        Log.d("DEBUG", "DNS lookup interrupted");
        return null;
    }

    //get the IP of the host
    InetAddress inetAddr = dnsRes.get();
    if(inetAddr==null) {
        Log.d("DEBUG", "DNS timed out.");
        return null;
    }

    //rebuild the URL with the IP and return it
    Log.d("DEBUG", "DNS solved.");
    return new URL(url.getProtocol(),inetAddr.getHostAddress(),url.getPort(),url.getFile());
}   

यह वर्ग इस ब्लॉग पोस्ट से है । जाओ और टिप्पणी की जाँच करें यदि आप इसका उपयोग करेंगे।

public static class DNSResolver implements Runnable {
    private String domain;
    private InetAddress inetAddr;

    public DNSResolver(String domain) {
        this.domain = domain;
    }

    public void run() {
        try {
            InetAddress addr = InetAddress.getByName(domain);
            set(addr);
        } catch (UnknownHostException e) {
        }
    }

    public synchronized void set(InetAddress inetAddr) {
        this.inetAddr = inetAddr;
    }
    public synchronized InetAddress get() {
        return inetAddr;
    }
}

1
HttpParams httpParameters = new BasicHttpParams();
            HttpProtocolParams.setVersion(httpParameters, HttpVersion.HTTP_1_1);
            HttpProtocolParams.setContentCharset(httpParameters,
                    HTTP.DEFAULT_CONTENT_CHARSET);
            HttpProtocolParams.setUseExpectContinue(httpParameters, true);

            // Set the timeout in milliseconds until a connection is
            // established.
            // The default value is zero, that means the timeout is not used.
            int timeoutConnection = 35 * 1000;
            HttpConnectionParams.setConnectionTimeout(httpParameters,
                    timeoutConnection);
            // Set the default socket timeout (SO_TIMEOUT)
            // in milliseconds which is the timeout for waiting for data.
            int timeoutSocket = 30 * 1000;
            HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

पूरा नहीं हुआ। क्या HttpClient के साथ संबंध हैं?
सज्जाद हिसैन खान

1

आप HttpClient-android-4.3.5 के साथ जिस तरह से HttpClient उदाहरण बना सकते हैं, यह अच्छी तरह से काम कर सकता है।

 SSLContext sslContext = SSLContexts.createSystemDefault();
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
                sslContext,
                SSLConnectionSocketFactory.STRICT_HOSTNAME_VERIFIER);
                RequestConfig.Builder requestConfigBuilder = RequestConfig.custom().setCircularRedirectsAllowed(false).setConnectionRequestTimeout(30*1000).setConnectTimeout(30 * 1000).setMaxRedirects(10).setSocketTimeout(60 * 1000);
        CloseableHttpClient hc = HttpClients.custom().setSSLSocketFactory(sslsf).setDefaultRequestConfig(requestConfigBuilder.build()).build();

1

एक विकल्प स्क्वायर से, OkHttp क्लाइंट का उपयोग करना है ।

पुस्तकालय निर्भरता जोड़ें

बिल्ड.ग्रेड में, इस लाइन को शामिल करें:

compile 'com.squareup.okhttp:okhttp:x.x.x'

x.x.xपुस्तकालय का वांछित संस्करण कहां है।

क्लाइंट सेट करें

उदाहरण के लिए, यदि आप 60 सेकंड का समय निर्धारित करना चाहते हैं, तो इस तरह से करें:

final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(60, TimeUnit.SECONDS);
okHttpClient.setConnectTimeout(60, TimeUnit.SECONDS);

ps: यदि आपका minSdkVersion 8 से अधिक है, तो आप उपयोग कर सकते हैं TimeUnit.MINUTES। तो, आप बस का उपयोग कर सकते हैं:

okHttpClient.setReadTimeout(1, TimeUnit.MINUTES);
okHttpClient.setConnectTimeout(1, TimeUnit.MINUTES);

इकाइयों के बारे में अधिक जानकारी के लिए, टाइम यूनिट देखें ।


OkHttp के वर्तमान संस्करण में, टाइमआउट को अलग से सेट करने की आवश्यकता है: https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/oktttp3/recipes/ConfigureTimeouts.java
thijsonline

1

यदि आप इसका उपयोग कर रहे हैं HttpURLConnection, तो यहांsetConnectTimeout() बताए अनुसार कॉल करें :

URL url = new URL(myurl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(CONNECT_TIMEOUT);

Http अनुरोध के बजाय, कनेक्शन स्थापित करने के लिए समय-सीमा का वर्णन अधिक है?
user2499800

0
public boolean isInternetWorking(){
    try {
        int timeOut = 5000;
        Socket socket = new Socket();
        SocketAddress socketAddress = new InetSocketAddress("8.8.8.8",53);
        socket.connect(socketAddress,timeOut);
        socket.close();
        return true;
    } catch (IOException e) {
        //silent
    }
    return false;
}

यह किस सर्वर का प्रतिनिधित्व करता है? "". ".
22.a
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.