2010-02-08 11 views
5

मेरी आखिरी परियोजना के बाद मुझे समस्या थी कि क्लाइंट सर्वर से ऑब्जेक्ट की अपेक्षा कर रहा था, लेकिन क्लाइंट को प्रोसेस करते समय एक अपवाद इनपुट करता है जो सुरक्षा कारणों से सर्वर को सॉकेट बंद करने के लिए मजबूर करता है।अपवाद के बाद सॉकेट को सही तरीके से कैसे बंद किया जाए?

यह एक बहुत ही अप्रिय तरह से समाप्त करने के लिए, जिस तरह से मैं यह प्रत्येक प्राप्त इनपुट के बाद ग्राहक को एक इनपुट स्थिति संदेश भेज रहा था के साथ सौदा करने का फैसला किया ग्राहक का कारण बनता है तो वह जानता है कि अगर उसके इनपुट ठीक से संसाधित किया गया था या अगर वह की जरूरत है अपवाद फेंकने के लिए।

तो मेरे सवाल:

  • वहाँ एक बेहतर/क्लीनर तरीका एक अपवाद पकड़ा है के बाद सॉकेट बंद करने के लिए है?

उत्तर

2

यदि मैं सही ढंग से समझता हूं कि आपने पहले से ही सर्वर की ओर से सॉकेट बंद कर दिया है, और आपको इसके क्लाइंट को यह समझने और उसके अनुसार त्रुटि को संभालने की आवश्यकता है।

Socket दस्तावेज़ीकरण और विशेष रूप से setSoTimeout विधि पर एक नज़र डालें। उदाहरण के लिए, यदि टाइमआउट 5 सेकंड पर सेट किया गया है और क्लाइंट सर्वर सॉकेट से पढ़ने का प्रयास करता है और उसे कोई जवाब नहीं मिलता है, तो टाइमआउट समाप्त हो जाता है और java.net.SocketTimeoutException उठाया जाता है और आप इसे पकड़ सकते हैं और सॉकेट बंद कर सकते हैं।

आप टाइमआउट अनुकरण करने के लिए ScheduledExecutorService या Timer का भी उपयोग कर सकते हैं।

2

इस तरह बातें के लिए:

  1. आज़माएं/कैच ब्लॉक के भीतर इस सॉकेट कोड डाल करने के लिए सुनिश्चित करें।
  2. सॉकेट को 'अंत में' बंद करें। इस तरह आप सुनिश्चित करते हैं कि आप सॉकेट को साफ़ रूप से बंद करें या नहीं, अपवाद है या नहीं।
+0

आपके उत्तर के लिए धन्यवाद, मैं यह करता हूं कि यह समस्या पहले से ही क्लाइंट को संवाद करने का तरीका है कि उसकी वस्तु नहीं आ रही है? – woolagaroo

0

आप वास्तव में नहीं के बाद से सॉकेट बंद कर दिया है, आप ग्राहक पर

java.net.SocketException: socket closed 

को सुन सके और कर सकते हैं और उसके बाद क्या आप जानते हैं कि आप सर्वर से कनेक्शन खो दिया है।

+0

गलत, मेरा उत्तर देखें। आप अपवादों के लिए 'सुन' नहीं सकते हैं, और उस अपवाद का अर्थ यह नहीं है। – EJP

1

गलत। यह अपवाद तब होता है जब आप सॉकेट का उपयोग करने का प्रयास करते हैं, तो आपने स्वयं को बंद कर दिया है।

ओपीएक्सप्शन, या IOException: 'कनेक्शन रीसेट', या सॉकेटटाइमआउट अपवाद है।

+0

धन्यवाद, कुछ नया सीखा। – Greg

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