2012-01-17 17 views
18

यदि कोई व्यक्ति निम्न व्यवहार जावा सॉकेट में व्याख्या कर सकते हैं:व्यवहार जब उत्पादन धारा को बंद करने

सामान्य विचार यह है:

  1. ओपन सॉकेट, प्राप्त आई/ओ धाराओं।
  2. लिखें अनुरोध, धारा
  3. पढ़ें प्रतिक्रिया, धारा
  4. बंद सॉकेट में बंद बाहर बंद कर दें।

मेरा प्रश्न/मुद्दा यहां है।

यदि मैं आउटपुट के लिए PrintWriter का उपयोग करता हूं, और फिर इसे बंद करता हूं, तो यह पूरे सॉकेट को बंद कर देता है, और बाद में पढ़ने का ऑपरेशन खराब तरीके से विफल हो जाता है।

इसके बजाय यदि मैं सीधे सॉकेट की shutdownOutput() विधि का उपयोग करता हूं, तो यह सॉकेट को जीवित रखते हुए आउटपुट स्ट्रीम चैनल को सही ढंग से बंद कर देता है।

PrintWriter ऑब्जेक्ट को बंद करने से पूरे सॉकेट को नीचे क्यों ले जाएगा?

+1

आपको बंद होने से पहले इसे फ़्लश करने की आवश्यकता हो सकती है। –

+1

क्या आपने यह देखने के लिए कि क्या समस्या नहीं होती है, अपने प्रिंटराइटर को बंद करने से पहले अपने कनेक्शन पर .flush() के साथ फ्लश करने का प्रयास किया है? – vcetinick

उत्तर

26

यह हो सकता है आपके कोड कैसा दिखता है:

Socket socket; 
PrintWriter pw = new PrintWriter(socket.getOutputStream()); 
pw.close(); 

अब, चलो सॉकेट की getOutputStream() विधि का वर्णन पर एक नज़र डालते हैं।

getOutputStream

public OutputStream getOutputStream() throws IOException

इस सॉकेट के लिए एक निर्गम धारा देता है। यदि इस सॉकेट में एक संबद्ध चैनल है तो परिणामी आउटपुट स्ट्रीम चैनल के सभी संचालन को चैनल में भेजती है। यदि चैनल गैर-अवरोधन मोड में है तो आउटपुट स्ट्रीम के लेखन ऑपरेशन IllegalBlockingModeException फेंक देंगे।

लौटा OutputStream बंद सॉकेट बंद कर देगा।

रिटर्न:

इस सॉकेट से बाइट्स लिखने के लिए एक निर्गम धारा।

फेंकता:

IOException - जब उत्पादन धारा बनाने या सॉकेट जुड़ा हुआ नहीं है, तो किसी I/O त्रुटि तब होती है।

ऊपर दिए गए विवरण से, हम जानते हैं कि लौटा OutputStream संबंधित सॉकेट बंद कर देगा।

अब, जब आप PrintWriter को बंद करते हैं, तो यह संबंधित OutputStream को बंद कर देगा जो संबंधित सॉकेट को बंद कर देगा।

+4

आरटीएफएम आह? :) मुझे लगता है कि यह पूरी तरह से बताता है। ब्लडवॉल्फ धन्यवाद! –

+0

@Alanmars ऐसी स्थिति से कैसे बचें। अगर मैं आउटपुटस्ट्रीम को बंद करने के बाद भी सॉकेट खोलना चाहता हूं तो क्या होगा। क्या इसे करने का कोई तरीका है? –

2

यह शायद इसलिए है क्योंकि बुला PrintWriter की close() विधि पदानुक्रम के माध्यम से वापस अनुरेखण और SocketOutputStream की close() पद्धति के रूप में अच्छी तरह से बुला रहा है। के SocketOutputStream के लिए विधि के रूप में यह close() विधि Socket के लिए भी कॉल करता है, जो टर्म में SocketInputStream भी बंद कर देगा। shutdownOutput() फ़ंक्शन को कॉल करने के बजाय टीसीपी के सामान्य कनेक्शन समाप्ति अनुक्रम के बाद किसी भी पहले लिखित डेटा भेजता है। यह तब आउटपुट स्ट्रीम को अक्षम करता है।

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