2010-08-06 26 views
20

मैं सोच रहा हूं कि जावा क्या करता है जब हम इनपुटस्ट्रीम और सॉकेट से जुड़े आउटस्ट्रीम पर बंद करते हैं। सॉकेट पर बंद कॉल से क्या अंतर है, यानी सॉकेट.क्लोज़()।इनपुट इनपुट/आउटपुटस्ट्रीम और बंद सॉकेट को बंद करने के बीच क्या अंतर है?

अगर हम सॉकेट पर आईओ स्ट्रीम बंद करते हैं, लेकिन सॉकेट को बंद नहीं करते हैं, तो क्या हम फिर से सॉकेट पर io स्ट्रीम को फिर से खोल सकते हैं?

अग्रिम धन्यवाद!

+0

देखें http://stackoverflow.com/questions/484925/does-closing-the-bufferedreader-printwriter-close-the-socket-connection – Istao

उत्तर

10

आपको सॉकेट से बनाए गए बाहरी आउटपुट स्ट्रीम को बंद करना चाहिए। वह इसे फ्लश करेगा। सॉकेट या इनपुट स्ट्रीम को बंद करना ऐसा नहीं करता है, इसलिए यह पर्याप्त नहीं है। आउटपुट स्ट्रीम को बंद करने के बाद आपको कुछ और करने की आवश्यकता नहीं है।

+0

आउटपुट स्ट्रीम को बंद करना == सॉकेट बंद करना। फ्लश + फिन शट डाउन आउटपुट के रूप में नहीं किया जा सकता है आउटपुट – irreputable

+3

यह पूरी तरह से गलत है। यदि आवश्यक हो तो आउटपुट स्ट्रीम को बंद करना * स्ट्रीम * को फ़्लश करता है (फ़िल्टरऑटपुटस्ट्रीम.क्लोज़() देखें) और फिर इसे और सॉकेट दोनों को बंद कर देता है। सॉकेट बंद करना * या * कॉलिंग शटडाउन आउटपुट * सॉकेट को फ्लश नहीं करता है (यानी इसका प्रेषण बफर), यह वर्तमान सॉकेट भेजने बफर के अंत में एक FIN कतार में आता है। उसके बाद क्या होता है, समापन प्रक्रिया के लिए असीमित है, जब तक कि यह एक सकारात्मक 'अदरक' टाइमआउट निर्धारित नहीं करता है। – EJP

+4

क्या मैं आपके से अलग इंटरनेट पर हूं? जावाडोक पढ़ें। 'शट डाउनऑटपुट' - "किसी भी पहले लिखित डेटा को टीसीपी के सामान्य कनेक्शन समाप्ति अनुक्रम" 'getOutputStream' के बाद भेजा जाएगा - "लौटा आउटपुटस्ट्रीम बंद करना संबंधित सॉकेट बंद कर देगा" 'बंद करें' - फ्लश और फिन के बारे में कुछ भी नहीं कहता है। – irreputable

17

जावा API दस्तावेज़ों से Socket के लिए:

सार्वजनिक शून्य के करीब() IOException इस सॉकेट बंद कर देता है फेंकता है। इस सॉकेट पर वर्तमान में I/O ऑपरेशन में अवरुद्ध कोई भी थ्रेड सॉकेट अपवाद फेंक देगा।

एक बार सॉकेट बंद हो जाने के बाद, यह आगे नेटवर्किंग उपयोग के लिए उपलब्ध नहीं है (यानी पुन: कनेक्ट नहीं किया जा सकता है या रिबाउंड नहीं किया जा सकता है)। एक नई सॉकेट बनाने की जरूरत है।

इस सॉकेट को बंद करने से सॉकेट के इनपुटस्ट्रीम और आउटपुटस्ट्रीम को भी बंद कर दिया जाएगा।

यदि इस सॉकेट में एक संबद्ध चैनल है तो चैनल भी बंद है।

सॉकेट के इनपुटस्ट्रीम को बंद करने से सॉकेट को बंद कर दिया जाएगा। सॉकेट के आउटपुटस्ट्रीम को बंद करने के लिए भी यही होता है।

जावा API दस्तावेज़ों से के लिए Socket#getInputStream()

समापन लौटे InputStream जुड़े सॉकेट बंद हो जाएगा।

एपीआई दस्तावेज की जांच करें, यह एक कारण के लिए है।

+0

तो आप InputStream.close कह रहे हैं Socket.close को कॉल करता है, जो बदले में InputStream.close को कॉल करता है, जो बदले में सॉकेट.क्लोज़ को कॉल करता है, जो बदले में InputStream.close ..... को कॉल करता है? – Pacerier

+0

स्ट्रीम बंद होने पर एक सॉकेट बंद हो जाती है। यदि आप InputStream.close को कॉल करते हैं और सॉकेट से पढ़ने का प्रयास करते हैं, तो यह एक अपवाद फेंक देगा। सॉकेट.क्लोस सॉकेट के इनपुट और आउटपुटस्ट्रीम को बंद करता है, अलग-अलग धाराओं पर बंद कॉलिंग सॉकेट.क्लोज़ को कॉल नहीं करता है, लेकिन फिर भी बंद सॉकेट में परिणाम देगा। – Jes

+0

निश्चित रूप से यह सॉकेट.क्लोज़() को कॉल करता है। असीमित प्रतिगमन को 'समापन' ध्वज से बचा जाता है। – EJP

1

यह और अधिक एक अच्छा जवाब की तुलना में एक टिप्पणी की तरह है: सवाल है, (मैं नहीं बल्कि एक टिप्पणी से एक के लिए ऊपर जवाब जोड़ना होगा, लेकिन मैं प्रतिनिधि नहीं है)

के रूप में मैंने इसे पढ़ा, "है क्या मैं सॉकेट पर एक स्ट्रीम बंद कर सकता हूं और फिर उसी सॉकेट पर एक स्ट्रीम खोल सकता हूं? "... लेकिन लोग इसका जवाब दे रहे हैं:" मुझे अपनी सॉकेट को साफ तरीके से कैसे बंद करना चाहिए? "... जो सवाल नहीं पूछा जा रहा है ।

पूछे जाने वाले प्रश्न का उत्तर "नहीं" है। जब आप स्ट्रीम बंद करते हैं, तो आप सॉकेट बंद करते हैं।

(मुझे समझ में आता है कि, कम से कम एक मामले में, कोई इस सवाल से क्यों पूछ सकता है। जब आप सॉकेट पर जावा प्रॉपर्टी स्ट्रीम कर रहे होते हैं तो प्राप्त करने वाले अंत को गुणों के अंत को पहचानने के लिए ईओएफ देखना होता है - रिसीवर के लिए ईओएफ को देखने के लिए प्रेषक को स्ट्रीम/सॉकेट बंद करना होगा। लेकिन, अगर आपके पास उस सॉकेट पर एक कमांड/प्रतिक्रिया प्रोटोकॉल चल रहा है, तो आप इसे बंद नहीं करना चाहते हैं या आप उस चैनल को खो देंगे जिसे आप प्रतिक्रिया भेजना चाहते हैं पर।इसे संभालने के लिए Java streaming Properties over Socket देखें)

+0

बंद करने की अपनी अवधारणा और फिर एक सॉकेट को फिर से खोलना और इसे जुड़े रहने की उम्मीद करना व्यर्थ है। – EJP

+1

@EJP मुझे नहीं लगता कि आपकी टिप्पणी सहायक या निष्पक्ष है। "अवधारणा" मेरा नहीं है, यह सवाल के पूछताछ द्वारा निहित है। यदि आप मेरा उत्तर अधिक सावधानीपूर्वक पढ़ते हैं तो आप देख सकते होंगे कि मुझे पता है कि आप बंद नहीं कर सकते हैं और फिर सॉकेट को फिर से खोल सकते हैं। मैंने अपना जवाब दोहराया है, इसलिए मेरा मुद्दा प्राप्त करना आसान है। – PMorganCA

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