এইচটিপিআরএল সংযোগের সময়সীমার সেটিংস


123

আমি মিথ্যা ফিরতে চাই যদি URL টি সংযোগ করতে আরও 5 সেকেন্ড সময় নেয় - জাভা ব্যবহার করে এটি কীভাবে সম্ভব? URL টি বৈধ কিনা তা পরীক্ষা করতে আমি যে কোডটি ব্যবহার করছি তা এখানে

HttpURLConnection.setFollowRedirects(false);
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("HEAD");
return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

উত্তর:


201

HttpURLConnectionএকটি সেট সংযোগটাইমআউট পদ্ধতি রয়েছে।

টাইমআউটটি 5000 মিলি সেকেন্ডে সেট করুন এবং তারপরে ধরুন java.net.SocketTimeoutException

আপনার কোডটি এর মতো দেখতে হবে:


try {
   HttpURLConnection.setFollowRedirects(false);
   HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
   con.setRequestMethod("HEAD");

   con.setConnectTimeout(5000); //set timeout to 5 seconds

   return (con.getResponseCode() == HttpURLConnection.HTTP_OK);
} catch (java.net.SocketTimeoutException e) {
   return false;
} catch (java.io.IOException e) {
   return false;
}



3
আমি মানটি 10 ​​মিনিটে সেট করি। যাইহোক এটি আমার java.net.ConnectException: Connection timed out: connect2 মিনিটেরও আগে ছোঁড়ে । আপনি কি জানেন যে সমস্যা সৃষ্টি করছে?
পেসারিয়ার

5
সকেটটাইমআউটএক্সেপশন হ'ল আইওএক্সেপশনের একটি সাবক্লাস। যদি উভয় ক্যাচ ব্লক একই কাজ করে তবে আপনি কেবল আইওএক্সেপশন ধরতে পারবেন।
spaaarky21

2
@ spaaarky21 সঠিক। তবে আপনি যদি ইউআই তৈরি করে থাকেন এবং আপনার ব্যবহারকারীদের একটি সময়সীমা শেষ হওয়ার বিষয়ে অবহিত করতে চান তবে আইওএক্সেপশনের আগে অবশ্যই সকেটটাইমআউটএক্সসেপশন ধরতে হবে, যদি তা না হয় তবে এটি অ্যাক্সেসযোগ্য হবে।
ক্লোকার

3
এনবি !!! setConnectTimeoutসুস্পষ্টভাবে সংযুক্ত যে কোনও পদ্ধতির আগে আপনাকে কল করতে হবে (ইতিমধ্যে সংযুক্ত থাকলে অবৈধভাবে সমস্ত পদ্ধতি যা অবৈধ স্ট্যাটেক্সপশন ফেলে দেয়)। আদর্শভাবে প্রথমে সেট করা সংযোগটিটাইমআউট (রিডটাইমআউট) তৈরি করুন।
অ্যাডাম জেন্ট

4
এটি আমার পক্ষে কাজ করে না। তবে যোগ করার পরে con.setReadTimeout()এটি প্রত্যাশার মতো কাজ করেছিল worked
পাওলো 16

115

আপনি এর মত টাইমআউট সেট করতে পারেন,

con.setConnectTimeout(connectTimeout);
con.setReadTimeout(socketTimeout);

2
সময়সীমাটির সর্বাধিক মান কী আমরা নির্দিষ্ট করতে পারি?
পেসারিয়ার

7
@ পেসারিয়ার ডকস এটিকে স্পষ্টভাবে বর্ণনা করে না। মানটি নেতিবাচক হলে এটি একটি অবৈধআর্গুমেন্ট এক্সেকশন ফেলে দেয় (0 টির মান মানে অনির্দিষ্টকালের জন্য অপেক্ষা করা)। যেহেতু সময়সীমাটি একটি স্বাক্ষরবিহীন 32 বিট ইনট, তাই আমি অনুমান করব যে সর্বাধিক সময়সীমাটি প্রায় 49 দিন হবে (যদিও আমি গুরুত্ব সহকারে সন্দেহ করি যে এই জাতীয় মানটি কারও পক্ষে সহায়ক হবে)।
জয় সিড্রি

1

যদি HTTP সংযোগের সময়সীমা শেষ না হয়, আপনি ব্যাকগ্রাউন্ড থ্রেডে নিজেই টাইমআউট পরীক্ষককে প্রয়োগ করতে পারেন (AsyncTask, পরিষেবাদি, ইত্যাদি), নিম্নলিখিত শ্রেণিটি নির্দিষ্ট সময়ের পরে কাস্টমাইজ করা AsyncTask এর উদাহরণ যা

public abstract class AsyncTaskWithTimer<Params, Progress, Result> extends
    AsyncTask<Params, Progress, Result> {

private static final int HTTP_REQUEST_TIMEOUT = 30000;

@Override
protected Result doInBackground(Params... params) {
    createTimeoutListener();
    return doInBackgroundImpl(params);
}

private void createTimeoutListener() {
    Thread timeout = new Thread() {
        public void run() {
            Looper.prepare();

            final Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {

                    if (AsyncTaskWithTimer.this != null
                            && AsyncTaskWithTimer.this.getStatus() != Status.FINISHED)
                        AsyncTaskWithTimer.this.cancel(true);
                    handler.removeCallbacks(this);
                    Looper.myLooper().quit();
                }
            }, HTTP_REQUEST_TIMEOUT);

            Looper.loop();
        }
    };
    timeout.start();
}

abstract protected Result doInBackgroundImpl(Params... params);
}

এই জন্য একটি নমুনা

public class AsyncTaskWithTimerSample extends AsyncTaskWithTimer<Void, Void, Void> {

    @Override
    protected void onCancelled(Void void) {
        Log.d(TAG, "Async Task onCancelled With Result");
        super.onCancelled(result);
    }

    @Override
    protected void onCancelled() {
        Log.d(TAG, "Async Task onCancelled");
        super.onCancelled();
    }

    @Override
    protected Void doInBackgroundImpl(Void... params) {
        // Do background work
        return null;
    };
 }

() বাতিল করার জন্য কল নির্ধারণের জন্য একটি নতুন লুপার থ্রেড তৈরি করা একেবারেই অপ্রয়োজনীয়। আপনি মূল থ্রেড থেকে এটি করতে পারেন onPreExecute()। এছাড়াও, আপনি যদি কাজটি ম্যানুয়ালি বাতিল করেন তবে ফাঁস এড়াতে আপনার নির্ধারিত কলটি বাতিল করা উচিত।
ব্লেডকডার

এখানে পয়েন্ট হ'ল ডিনব্যাকগ্রাউন্ড () এর মাঝখানে অ্যাসিঙ্কটাস্ক বাতিল করতে হবে যখন অনপ্রিচেকিউট () এ না হয়ে মৃত্যুদন্ড কার্যকর করার সময় খুব বেশি সময় লাগে, আমি কেবলমাত্র এসিঙ্কটাস্কের এই উদাহরণটি বাতিল করতে চাই যা খুব বেশি সময় নেয় এবং অন্যদের রাখে, অনেক প্রশংসা করি আপনার মতামত
আয়মান মাহগুব

2
আমি মনে করি আমার বার্তাটি যথেষ্ট পরিষ্কার ছিল না। আমি বলিনি যে আপনি অন প্রিপেক্সেকিউট () এ বাতিল করতে হবে, আমি বলেছিলাম আপনার অনপ্রেসেক্সট ()) এ হ্যান্ডলারটি তৈরি করা উচিত এবং মূল থ্রেড থেকে বিলম্বিত বাতিল পোস্ট করুন। এইভাবে আপনি লুপার থ্রেড হিসাবে মূল থ্রেডটি ব্যবহার করবেন এবং আপনি অবশ্যই AsyncTask বাতিল করতে পারবেন পরে doInBackground () চালিত হওয়ার কারণে মূল থ্রেডটিও পটভূমির থ্রেডের সাথে একই সাথে চলবে।
ব্লেডকডার

-1

একটি সাধারণ লাইন যুক্ত করে আমি এই জাতীয় সমস্যার সমাধান পেতে পারি

HttpURLConnection hConn = (HttpURLConnection) url.openConnection();
hConn.setRequestMethod("HEAD");

আমার প্রয়োজনটি ছিল প্রতিক্রিয়া কোডটি জানা এবং তার জন্য সম্পূর্ণ প্রতিক্রিয়া বডি না পেয়ে কেবল মেটা-তথ্য পাওয়া যথেষ্ট ছিল।

ডিফল্ট অনুরোধ পদ্ধতিটি জিইটি এবং এটি ফিরে আসতে প্রচুর সময় নিয়েছিল, অবশেষে আমাকে সকেটটাইমআউটএক্সপেশন নিক্ষেপ করল। প্রতিক্রিয়াটি বেশ দ্রুত ছিল যখন আমি অনুরোধের পদ্ধতিটি হেডকে সেট করি।


1
এটি কোনওভাবেই সমাধান নয়, আপনি অনুরোধের পদ্ধতিটি অনুরোধে পরিবর্তন করছেন HEADযা কোনও প্রতিক্রিয়া দেবে না।
স্বেইনং কোভাল বাক্কেন

এটি মূল প্রশ্নের সাথে কিছু যুক্ত করে না। ওপি .setRequestMethod("HEAD")তাদের কোড আছে। অদ্ভুতভাবে, এই বিবরণটি আমার "অনেক বেশি খোলা ফাইল" ইস্যুটি হ্রাস করার জন্য ঠিক আমার প্রয়োজন ছিল। সূতরাং ধন্যবাদ?
জোশুয়া পিন্টর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.