كيف يمكنني تعيين مهلة مقابل BufferedReader بناءً على URLConnection في Java؟

StackOverflow https://stackoverflow.com/questions/93357

  •  01-07-2019
  •  | 
  •  

سؤال

أرغب في قراءة محتويات عنوان URL ولكن لا أريد "تعليقه" إذا كان عنوان URL لا يستجيب.لقد قمت بإنشاء BufferedReader باستخدام عنوان URL...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

.. ثم بدأت الحلقة لقراءة المحتويات ...

do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

...ولكن إذا توقفت القراءة، فسيتم تعليق التطبيق.

هل هناك طريقة، دون خفض الكود إلى مستوى المقبس، "لإنهاء مهلة" القراءة إذا لزم الأمر؟

هل كانت مفيدة؟

المحلول

أعتقد أن URLConnection.setReadTimeout هو ما تبحث عنه.

نصائح أخرى

إذا كان لديك جافا 1.4:

أفترض انتهاء مهلة الاتصال (URLConnection.setConnectTimeout(int timeout) ) ليس له أي فائدة لأنك تقوم بنوع من البث.

---لا تقتل الخيط--- قد يسبب مشاكل غير معروفة، واصفات مفتوحة، وما إلى ذلك.

قم بإنشاء java.util.TimerTask حيث ستتحقق مما إذا كنت قد انتهيت من العملية، وإلا، قم بإغلاق BufferedReader وOutputStream الخاصين بـ URLConnection

أدخل علامة منطقية isFinished واضبطه على "صحيح" في نهاية الحلقة وعلى "خطأ" قبل الحلقة

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

من المحتمل أن يتسبب هذا في حدوث استثناء ioexception، لذا عليك اكتشافه.الاستثناء ليس أمرا سيئا في حد ذاته.أنا أحذف بعض التصريحات (أي.Finals) حتى يتمكن الفصل المجهول من الوصول إلى المتغيرات الخاصة بك.إذا لم يكن الأمر كذلك، فقم بإنشاء POJO الذي يحتفظ بالمرجع وتمريره إلى المهمة الزمنية

منذ Java 1.5، من الممكن ضبط مهلة القراءة بالمللي ثانية على المقبس الأساسي عبر طريقة "setReadTimeout(int timeout)" في فئة URLConnection.

لاحظ أن هناك أيضًا "setConnectTimeout(int timeout)" الذي سيفعل نفس الشيء بالنسبة للاتصال الأولي بالخادم البعيد، لذا من المهم تعيين ذلك أيضًا.

لقد كنت أعمل على هذه المشكلة في بيئة JVM 1.4 مؤخرًا.إجابة المخزون هي استخدام خصائص النظام sun.net.client.defaultReadTimeout (مهلة القراءة) و/أو sun.net.client.defaultConnectTimeout.تم توثيق هذه في خصائص الشبكات ويمكن تعيينه عبر الوسيطة -D في سطر أوامر Java أو عبر استدعاء أسلوب System.setProperty.

من المفترض أن يتم تخزينها مؤقتًا بواسطة التنفيذ بحيث لا يمكنك تغييرها من شيء إلى آخر بحيث يتم استخدامها مرة واحدة، ويتم الاحتفاظ بالقيم.

كما أنها لا تعمل حقًا مع اتصالات SSL مثل HttpsURLConnection.هناك طرق أخرى للتعامل مع ذلك باستخدام SSLSocketFactory مخصص.

مرة أخرى، كل هذا ينطبق على JVM 1.4.x.في الإصدار 1.5 وما فوق، لديك المزيد من الطرق المتاحة لك في واجهة برمجة التطبيقات (كما لاحظ المستجيبون الآخرون أعلاه).

بالنسبة لـ Java 1.4، يمكنك استخدام SimpleHttpConnectionManager.getConnectionWithTimeout(hostConf,CONNECTION_TIMEOUT) من Apache

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top