2010-04-14 12 views
7

मेरे पास DataInputStream है जो मैंने Socket से प्राप्त किया है। क्या कोई तरीका है कि मैं dis.read(...) के लिए टाइमआउट सेट कर सकता हूं? वर्तमान में मैंने पढ़ने के लिए एक नया धागा पैदा किया। जबकि पैरेंट थ्रेड thread.join(timeout) करता है ताकि इसे बाधित करने से पहले प्रतीक्षा कर सकें। मुझे निओ के बारे में पता है, लेकिन मुझे नहीं लगता कि मैं इस बिंदु पर इतना अधिक प्रतिक्रिया देना चाहता हूं। धन्यवाद।क्या मैं इनपुट इनपुट के पढ़ने() फ़ंक्शन के लिए टाइमआउट सेट कर सकता हूं?

उत्तर

14

आमतौर पर इनपुटस्ट्रीम पर नहीं, लेकिन आप सॉकेट पर सभी पढ़ने के संचालन के लिए टाइमआउट सेट करने के लिए Socket#setSoTimeout(int) का उपयोग कर सकते हैं।

+1

आह धन्यवाद, मुझे वह याद आया। मेरा एकमात्र अनुवर्ती प्रश्न यह है: इस बार प्रत्येक बार पढ़ने के लिए गणना की जाती है() कहा जाता है, जो कई बार हो सकता है। क्या कोई तरीका है कि मैं पूरे टाइमआउट समय को सेट कर सकता हूं जैसे कि यह समय-समय पर होगा यदि प्रत्येक पढ़ने() का योग टाइमआउट से अधिक हो? – Zombies

+0

स्वचालित रूप से नहीं, लेकिन आप अपने वास्तविक टाइमआउट की तुलना में एक छोटा S0-timeout सेट कर सकते हैं और यदि आपने अपने कुल अनुमत रन टाइम को पार कर लिया है तो लूप में चेक करें। – jarnbjo

+4

एक सॉकेट टाइमआउट और DataInputStream का उपयोग करने के साथ सावधान रहें (और एक बफर्रेड इनपुटस्ट्रीम)। ये अस्थायी स्मृति (जैसे getLong() में कुछ डेटा बफर या पढ़ेंगे) और फिर यदि टाइमआउट होता है (सॉकेट से अधिक डेटा पर इंतजार कर रहा है) तो आप पहले से पढ़े गए किसी भी डेटा को खो देंगे और * पुनर्प्राप्त करने का कोई तरीका नहीं है * । सॉकेटटाइमआउट एक्सेप्शन इंटरप्टेडियोएक्सप्शन को बढ़ाता है जो टाइमआउट से पहले सफलतापूर्वक स्थानांतरित बाइट्स की संख्या प्रदान करता है। कच्चे सॉकेट के साथ आप इसे पुनः प्रयास/जारी रखने के लिए उपयोग कर सकते हैं (शायद खराब संदेश को फ़्लश करने के लिए)। –

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

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