2014-07-03 5 views
9

निम्नलिखित स्निपेट पर विचार करें:समझने URLConnection.setReadTimeout()

URLConnection connection = target.openConnection(); 

connection.setConnectTimeout(5000); // 5 sec 
connection.setReadTimeout(10000); // 10 sec 

connection.setReadTimeout सेट अधिक से अधिक समय शुरू करने के लिए उपलब्ध डेटा को पढ़ने या इसे अधिक से अधिक समय पढ़ने डेटा को पूरा करने के लिए उपलब्ध है करता है?

मेरा अंडरस्टिंगिंग यह है कि जावा के पास कनेक्शन से डेटा के अगले बाइट को पढ़ने के लिए 10 सेकंड हैं। कनेक्शन से सभी डेटा पढ़ने के लिए कोई समय नहीं है क्योंकि हम नहीं जानते कि स्ट्रेन कितना बड़ा हो सकता है। क्या यह सही है?

उत्तर

6

ओरेकल डॉक्स के मुताबिक, अगर कोई डेटा पढ़ने समाप्त अवधि के लिए उपलब्ध है, अपवाद

फेंकी जा सकती है
जब लौटे इनपुट स्ट्रीम से पढ़ने यदि पढ़ने का समय समाप्त डेटा से पहले समाप्त हो रहा है

एक SocketTimeoutException फेंकी जा सकती है पढ़ने के लिए उपलब्ध है।

6

यह "प्रारंभ" डेटा पढ़ने के लिए है। आने वाले डेटा के लिए प्रतीक्षा कितनी देर तक है, इस पर सीमा निर्धारित करने के लिए टाइमआउट है। पढ़ने के लिए डेटा उपलब्ध होने पर टाइमआउट लागू नहीं होता है।

"अगर डेटाआउट पढ़ने के लिए डेटा उपलब्ध होने से पहले समाप्त हो जाता है, तो java.net.SocketTimeoutException उठाया जाता है।"

Oracle Reference

संक्षेप में - अपनी समझ को सही है।

+0

तो यह टाइमआउट हमें धीमी लॉरीज़ जैसे हमले से नहीं बचा सकता है, है ना? – kommradHomer

5

आप सही हैं! connection.setReadTimeout का अर्थ पूर्ण नहीं हुआ है, इसका मतलब यह है कि 10s के लिए प्रतीक्षा करें, जब कोई और डेटा नहीं पढ़ा जाए, तो टाइमआउट अपवाद फेंक देगा।

संबंधित मुद्दे