2010-06-18 17 views
107

3 प्रश्न:सॉकेट के लिए कनेक्शन और रीड टाइमआउट के बीच क्या अंतर है?

  1. कनेक्शन और सॉकेट के लिए टाइमआउट पढ़ के बीच क्या अंतर है?

  2. कनेक्शन "अनंतता" पर सेट टाइमआउट का क्या अर्थ है? एक अव्यवस्थित लूप में यह किस स्थिति में रह सकता है? और क्या ट्रिगर कर सकता है कि अनंत-लूप मर जाता है?

  3. पढ़ने के लिए "अनंतता" का अर्थ क्या है? एक अव्यवस्थित लूप में यह किस स्थिति में रह सकता है? और क्या ट्रिगर कर सकता है कि अनंत-लूप मर जाता है?

उत्तर

135

1) कनेक्शन और सॉकेट के लिए पढ़ने के लिए समय समाप्ति के बीच क्या अंतर है?

कनेक्शन टाइमआउट प्रारंभिक कनेक्शन बनाने में समय समाप्ति है; यानी टीसीपी कनेक्शन हैंडशेक पूरा करना। रीड टाइमआउट डेटा पढ़ने के इंतजार पर टाइमआउट है। विशेष रूप से, यदि सर्वर बाइट < टाइमआउट> अंतिम बाइट के बाद सेकंड भेजने में विफल रहता है, तो एक रीड टाइमआउट त्रुटि उठाई जाएगी।

2) कनेक्शन टाइमआउट "अनंतता" पर क्या मतलब है? एक अव्यवस्थित लूप में यह किस स्थिति में रह सकता है? और क्या ट्रिगर कर सकता है कि अनंत-लूप मर जाता है?

इसका मतलब है कि कनेक्शन प्रयास संभावित रूप से हमेशा के लिए अवरुद्ध हो सकता है। कोई अनंत लूप नहीं है, लेकिन कनेक्ट करने का प्रयास सॉकेट को बंद करने वाले किसी अन्य थ्रेड द्वारा अनब्लॉक किया जा सकता है। (ए Thread.interrupt() कॉल भी चाल कर सकता है ... सुनिश्चित नहीं है।)

3) "अनंतता" के लिए निर्धारित टाइमआउट सेट क्या है? एक अव्यवस्थित लूप में यह किस स्थिति में रह सकता है? और क्या ट्रिगर कर सकता है कि अनंत-लूप मर जाता है?

इसका मतलब है कि सॉकेट स्ट्रीम पर read पर कॉल हमेशा के लिए अवरुद्ध हो सकता है। एक बार फिर कोई अनंत लूप नहीं है, लेकिन read को Thread.interrupt() कॉल द्वारा अनब्लॉक किया जा सकता है, सॉकेट बंद कर दिया जा सकता है, और (निश्चित रूप से) दूसरा अंत डेटा भेज रहा है या कनेक्शन बंद कर रहा है।

+0

"पढ़ा गया टाइमआउट डेटा पढ़ने के लिए प्रतीक्षा करने का समय है।"। आपने डेटा पढ़ने के लिए "प्रतीक्षा" लिखा था? टाइमआउट पढ़ें वह समय नहीं है जब सॉकेट कितनी देर तक खुला हो सकता है? – corgrath

+0

जावा में आप कनेक्शन में "अनंतता" सेट कर सकते हैं और टाइमआउट पढ़ सकते हैं। मैं सोच रहा हूं कि ये परिस्थितियां कैसे हो सकती हैं (जहां यह एक infinitive पाश में होगा)। यदि आप कहते हैं कि कनेक्शन टीसीपी हैंडशेक के लिए है, तो प्रतीक्षा कैसे अविश्वसनीय हो सकती है? क्या टीसीपी में सभी पैकेट नहीं हैं? – corgrath

+4

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

6

ये टाइमआउट मान टीसीपी कनेक्शन प्रतिष्ठान के लिए जेवीएम द्वारा लागू किए गए हैं और सॉकेट से डेटा पढ़ने पर प्रतीक्षा कर रहे हैं।

यदि मान अनंत पर सेट है, तो आप हमेशा के लिए प्रतीक्षा नहीं करेंगे। इसका मतलब है कि जेवीएम में टाइमआउट नहीं है और ओएस सभी टाइमआउट के लिए ज़िम्मेदार होगा। हालांकि, ओएस पर टाइमआउट वास्तव में लंबा हो सकता है। कुछ धीमी नेटवर्क पर, मैंने 6 मिनट तक टाइमआउट देखा है।

यदि आप सॉकेट के लिए टाइमआउट मान सेट करते हैं, तो यह भी काम नहीं कर सकता है अगर मूल कोड में टाइमआउट होता है। हम फ़ायरवॉल द्वारा अवरुद्ध मेजबान या स्विच पर केबल को अनप्लग करने से कनेक्ट करके लिनक्स पर समस्या को पुन: उत्पन्न कर सकते हैं।

टीसीपी टाइमआउट को संभालने का एकमात्र सुरक्षित तरीका कनेक्शन कोड को एक अलग थ्रेड में चलाने और थ्रेड को बहुत लंबा होने पर बाधित करना है।

+0

"यदि मान अनंत पर सेट है, तो आप हमेशा के लिए प्रतीक्षा नहीं करेंगे।" जब तक यह "अनंतता" के अर्थ के बारे में चर्चा के बारे में नहीं है, तब तक यह सुनिश्चित हो सकता है कि आप बहुत लंबे समय तक प्रतीक्षा करें। हमारे यहां एक मामला था, जहां 'HttpURLConnection.getResponseCode()' अनुमोदन के लिए लटक रहा था। एक सप्ताह जब तक हम प्रक्रिया को पुनरारंभ नहीं किया। स्पष्ट रूप से जेवीएम पक्ष पर कोई टाइमआउट सेट नहीं था और साथ ही लिनक्स ओएस पक्ष पर कोई टाइमआउट नहीं था। –

+0

अंतिम अनुच्छेद सही नहीं है। एक कनेक्ट लगभग एक मिनट के बाद टाइमआउट होगा। एक अलग धागा पूरी तरह से अनावश्यक है। यदि आप कोई डेटा नहीं है तो आप निश्चित रूप से * पढ़ सकते हैं * जो हमेशा के लिए दौड़ते हैं। हालांकि जावा कनेक्ट डिफ़ॉल्ट कनेक्ट टाइमआउट अनंत होने के बारे में गलत है। यह नहीं है – EJP

+1

@comeGetSome यह सही नहीं है। आप इनपुट के लिए सॉकेट बंद कर सकते हैं। इससे अवरुद्ध पढ़ने को धारा के अंत का सामना करना पड़ेगा। – EJP

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