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


180

3 प्रश्न:

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

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

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

जवाबों:


227

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

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

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

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

3) "अनन्तता" का अर्थ क्या है? वह किस स्थिति में अनंत पाश में रह सकता है? क्या अनंत लूप को समाप्त करने के लिए ट्रिगर कर सकता है?

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


1 - ऐसा नहीं है ... जैसा कि एक टिप्पणीकार ने सोचा ... एक सॉकेट कितने समय तक खुला रह सकता है, या निष्क्रिय।


8

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

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

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

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


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

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

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

@ WelcomeGetSome: मुझे इसे एक ऐसे सूत्र का उपयोग करके लागू करना था जो एक खुले HTTP URL कनेक्शन का संदर्भ रखता है। जब थ्रेड कनेक्शन को बंद करता है, तो दूसरा थ्रेड "java.net.SocketException: सॉकेट बंद हो जाता है" फेंकता है। मुझे करने के लिए बग JDK-8075484 धन्यवाद!
15 अक्टूबर को fmcato

@comeGetSome निश्चित रूप से आप Socket.shutdownInput()अपना हाथ पकड़े बिना कॉल कर सकते हैं ? NB ये टाइमआउट टीसीपी द्वारा लागू किए जाते हैं, जेवीएम द्वारा नहीं।
लोर्ने का मार्किस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.