জাভাতে অ্যান্ড্রয়েডের জন্য কীভাবে এইচটিটিপিআরস্পোনস টাইমআউট সেট করবেন


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
@ থমাস: আপনার উত্তর কেস সমাধানের জন্য আমি আমার উত্তর সম্পাদনা করেছি
kueter2000

3
সংযোগটি সময় শেষ হয়ে গেলে এইচটিটিপিআরস্পোন কী ফিরিয়ে দেবে? এই মুহুর্তে একবার আমার এইচটিটিপি অনুরোধ করা হয়ে গেলে, আমি কলটি ফেরার সময় স্থিতি কোডটি যাচাই করি, তবে কলটি শেষ হয়ে গেলে এই কোডটি চেক করার সময় আমি একটি নালপয়েন্টার এক্সসেপশন পেয়েছি ... মূলত, কল করার পরে আমি পরিস্থিতিটি কীভাবে পরিচালনা করব? টাইমআউট হয়? (আমি আপনার দেওয়া উত্তরের সাথে খুব অনুরূপ কোড ব্যবহার করছি)
টিম

10
@ জেলিফিশ - ডকুমেন্টেশন থাকা সত্ত্বেও, AndroidHttpClient ডিফল্টহট্টপ্লিকায়েন্ট প্রসারিত করে না ; বরং এটি HTTPClient প্রয়োগ করে। সেটপ্যারামস (এইচটিপিপিরামস) পদ্ধতি উপলব্ধ করার জন্য আপনাকে ডিফল্ট এইচটিপিপিলেট ব্যবহার করতে হবে।
টেড হপ

3
ওহে ছেলেরা, উত্তরের উত্তরের জন্য অপেক্ষা করছে না। তবে, আমি সংযোগের সময়সীমাতে ব্যবহারকারীদের কাছে একটি টোস্ট দেখাতে চাই ... সংযোগটি শেষ হওয়ার পরে আমি কীভাবে সনাক্ত করতে পারি?
অর্ণব চক্রবর্তী

2
কাজ করে না। আমি আমার সনি এবং মোটোতে পরীক্ষা করেছিলাম, তারা সকলেই শক্ত হয়ে যায়।
thecr0w

13

ক্লায়েন্টে সেটিংস সেট করতে:

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

আমি এটি জেলিবিনে সফলভাবে ব্যবহার করেছি, তবে এটি পুরানো প্ল্যাটফর্মগুলির জন্যও কাজ করা উচিত ....

আছে HTH


এইচটিপিপিপ্লিয়েন্টের সাথে কী সম্পর্ক?
সাজ্জাদ হিছাইন খান

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
এইচটিপিপি্লিয়েন্টপ্যারামস.সিএনএনইક્શન_মনাগের_আমিওউট অজানা
তাওয়ানি

আপনার * * _টিমিওট প্যারামের জন্য ক্লায়েন্ট.জেটপ্যারামস () .সেটট্যান্টপ্যারামিটার (..) ব্যবহার করা উচিত
লুফিয়

কিভাবে পাবো? ডিভাইসটি ওয়াইফাইয়ের সাথে সংযুক্ত থাকলেও ওয়াইফাইয়ের মাধ্যমে আসলে সক্রিয় ডেটা হয় না।
গণেশ কাটিকর

7

আপনি যদি ডিফল্ট HTTP ক্লায়েন্ট ব্যবহার করে থাকেন তবে ডিফল্ট HTTP প্যারাম ব্যবহার করে এটি কীভাবে করবেন তা এখানে:

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 অনুরোধের সময়সীমা ছাড়াই কাজ করে তবে এটি কারণ আপনি কোনও ডিএনএস সার্ভারে পৌঁছাতে সক্ষম হন বা আপনি অ্যান্ড্রয়েড ডিএনএস ক্যাশে হিট করছেন। উপায় দ্বারা আপনি ডিভাইসটি পুনরায় চালু করে এই ক্যাশেটি সাফ করতে পারেন।

এই কোডটি একটি কাস্টম সময়সীমার সাথে একটি ম্যানুয়াল ডিএনএস লুকআপ অন্তর্ভুক্ত করার জন্য মূল উত্তরটি প্রসারিত করে:

//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);

অসম্পূর্ণ. এইচটিটিপিপ্লিনেন্টের সাথে কী সম্পর্ক?
সাজ্জাদ হিছাইন খান

1

আপনি Httpclient-android-4.3.5 দিয়ে উপায় দ্বারা এইচটিপিপি্লিয়েন্ট উদাহরণ তৈরি করতে পারেন, এটি ভাল কাজ করতে পারে।

 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 ক্লায়েন্ট ব্যবহার করা একটি বিকল্প ।

লাইব্রেরি নির্ভরতা যুক্ত করুন

বিল্ড.gradle এ, এই লাইনটি অন্তর্ভুক্ত করুন:

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/sample/guide/src/main/java/okhttp3/recips/ConfigureTimeouts.java
thijsonline

1

আপনি যদি ব্যবহার করে থাকেন তবে এখানে বর্ণিত হিসাবে HttpURLConnectionকল করুন :setConnectTimeout()

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

বিবরণটি কি HTTP অনুরোধের পরিবর্তে সংযোগ স্থাপনের সময়সীমা মতো?
ব্যবহারকারী 2499800

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

এটি কোন সার্ভারের প্রতিনিধিত্ব করে? "8.8.8.8", 53
জুনে 18
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.