2012-09-13 13 views
10

मैं एक बहुत भारी कर्तव्य प्रक्रिया पर कॉल करने की कोशिश कर रहा हूं। औसत कार्य की लंबाई 9-10 मिनट तक अनुमानित है।जावा: सॉकेट रीड टाइम अप अपवाद

java.net.SocketTimeoutException: Read timed out

मैं के साथ गड़बड़ करने की कोशिश की: 99999999.

2 मिनट के बाद, मैं निम्नलिखित त्रुटि मिलती है:

जब मैं प्रक्रिया को क्रियान्वित कर रहा हूँ, मैं एक हास्यास्पद बड़ी संख्या के लिए समाप्ति सेट यह कुछ और है, और मैंने टाइमआउट को 3000 तक सेट किया है, और अनुमान के अनुसार 3 सेकंड के बाद मुझे एक ही त्रुटि मिली है।

क्या आपको कोई विचार है कि socket.setSoTimeout(99999999) इसे 120000 अधिकतम क्यों सेट करता है?

+3

में इस बारे में अधिक पढ़ सकते हैं यह विधि ओएस को गुजरती है, इसलिए इस विधि का व्यवहार आपके ओएस पर निर्भर करता है। आप किस ओएस का उपयोग कर रहे हैं? –

+1

क्या आपने ज़िंदा संदेशों को भेजने की कोशिश की है या प्रक्रिया को "कॉल" करने के बाद उम्र समाप्त होने के बजाय सॉकेट को खोलने के बजाय इसे पूरा किया है? – Thor84no

+1

ऐसा लगता है कि ओएस सिर्फ आपके मूल्य को अस्वीकार कर देता है क्योंकि यदि यह सीमा से बाहर है। मैं उच्च मूल्यों के साथ खेलने की कोशिश करता हूं लेकिन इतना ऊंचा नहीं (आप इसे 27 घंटे से अधिक समय तक सेट कर रहे हैं)। v.g., 3 मिनट, 5 मिनट, 10 मिनट। – SJuan76

उत्तर

2

मैं एक ही समस्या थी और समाधान socket.shutdownInput(); socket.shutDownOutput(); का उपयोग नहीं किया गया था सॉकेट से पढ़ने या लिखने के डेटा के अंतिम समय तक। इसने सॉकेट को FIN_WAIT स्थिति में जाने के लिए इस प्रकार बंद होने से 2 मिनट पहले इंतजार किया। आप this post

+0

यह तकनीक संभावित रूप से एक रीड टाइमआउट अपवाद हल नहीं कर सकती है। – EJP

+0

यदि आपने अपना टेस्ट केस चलाने के लिए समय निकाला तो आपने देखा होगा कि यह समाधान है। और आप इसे स्वयं आज़मा सकते हैं, सॉकेट में कुछ इनपुट लिख सकते हैं और 'शटडाउन इनपुट' का उपयोग कर सकते हैं और आप देखेंगे कि सॉकेट FIN_WAIT स्थिति में बदल जाएगी। 2 मिनट प्रतीक्षा करें और आप देखेंगे कि सॉकेट बंद है। – Rotem

+1

धन्यवाद आवंटित रोटेम, जो काम करता है! :) – Urbanleg

1

मैं कैसे अपने आवेदन काम करता है यकीन नहीं है, लेकिन आप अपने कॉल के बारे में अधिक जानकारी प्रदान करते हैं एक अनंत timeout to the socket

public void setSoTimeout(int timeout) 
       throws SocketException 

Enable/disable SO_TIMEOUT with the specified timeout, in milliseconds. With this option set to a non-zero timeout, a read() call on the InputStream associated with this Socket will block for only this amount of time. If the timeout expires, a java.net.SocketTimeoutException is raised, though the Socket is still valid. The option must be enabled prior to entering the blocking operation to have effect. The timeout must be > 0 . A timeout of zero is interpreted as an infinite timeout.

सेट करने का प्रयास, मैं जवाब में सुधार कर सकते हैं।

+0

मैंने समय को 0 पर सेट करने का प्रयास किया (जो अनंत समय होना चाहिए) लेकिन फिर, 120 सेकंड के बाद यह अपवाद फेंकता है। – Urbanleg

+0

जब आप जुड़े हुए हैं, तो क्या बफर किसी भी डेटा को पढ़ता है? मेरा मतलब है, क्या सर्वर आपके कनेक्शन का जवाब दे रहा है ?, क्योंकि एक मौका है कि सर्वर नेटवर्क को आपके नेटवर्क में सही तरीके से हल नहीं किया गया है, मुझे नहीं पता कि यह स्थानीय है, या एक वीपीएन, या सिर्फ एक रिमोट सर्वर है, मैं नहीं करता पता नहीं है कि नेटबीस क्वेरी, या होस्ट फ़ाइल, या रिमोट डीएनएस का उपयोग करके पता लगाया गया है या नहीं, ऐसे कई तत्व हैं जो गलत पते –

+0

कर सकते हैं सर्वर स्थानीय है, जब मैं भारी कर्तव्य प्रक्रिया निर्धारित कर रहा हूं 2 मिनट से कम समय लेना यह ठीक काम करता है। – Urbanleg

2

स्पष्ट रूप से आप उस समय को सेट नहीं कर रहे हैं जिसे आप सोचते हैं कि आप सेटिंग कर रहे हैं, या कोई और बाद में इसे बदल रहा है। आगे की व्याख्या पाने के लिए आपको कुछ कोड पोस्ट करना होगा।

ध्यान दें कि टीसीपी/आईपी इलस्ट्रेटेड, खंड द्वितीय, # 17.4 में W.R. स्टीवंस के अनुसार, समय समाप्ति 1000Hz की एक संख्या के रूप में एक छोटी में आयोजित किया जाता टिक्स, इसलिए 11 मिनट से परे एक समय समाप्ति संभव नहीं है। यह बीएसडी कोड पर लागू होता है।

+0

@downvoter नहीं पता है। आप स्टीवंस से असहमत हैं? – EJP

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