2011-12-13 14 views
9

क्या आप संबंधित सॉकेट को बंद किए बिना जावा InputStream से पढ़ने में बाधा डालने का तरीका जानते हैं?java.nio का उपयोग करने का कोई तरीका। * सॉकेट बंद किए बिना इनपुट इनपुट # को पढ़ने() को बाधित करने के लिए?

InputStream interruptibleInputStream = Channels.newInputStream(Channels.newChannel(m_ConnectionData.getSocket().getInputStream())); 
DataInputStream myInterruptibleDIS = new DataInputStream(interruptibleInputStream); 

यह एक ReadableByteChannel जो एक ClosedByInterruptException फेंकने योग्य के लिए समर्थन के साथ एक read(ByteBuffer) विधि प्रदान करता है का उपयोग करता है:

यहाँ एक सॉकेट इनपुट धारा हथियाने और एक व्यवधान कारक DataInputStream को परिवर्तित करने के लिए वर्तमान निर्माण रणनीति है।

समस्या यह है कि पर read() कॉल पर थ्रेड बनाने पर बाधा डालने से अंतर्निहित सॉकेट बंद हो जाता है।

मेरी संदर्भ मैं सॉकेट की जरूरत खुले रहने के लिए के लिए

; read कॉल उपयोगकर्ता इनपुट जो नहीं आ रहा है इंतजार कर रहा है, तो मैं बाधा उपयोग कर रहा हूँ नियंत्रण एक उच्च घटक को वापस पारित करने के लिए और फिर अंत में फिर से read की ओर लौटने।

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

मैं समझता हूँ कि वहाँ एक ही प्रभाव को प्राप्त करने के लिए अन्य तरीके हैं, लेकिन फिर भी जानना आवश्यक है कि इस दृष्टिकोण संभव है उत्सुक हूँ।

+0

आप सॉकेट पर एक 'Selector' और' .Select (int) 'उपयोग कर सकते हैं। – fge

+1

सॉकेट पर एक पठन टाइमआउट सेट करें। – jtahlborn

+0

@fge - धन्यवाद। मैंने जो सुझाव दिया है उसकी जांच की है और यह व्यवहार्य दिखता है। तो अगर मैं अपने थ्रेड में mySelector.select() को सीधे पढ़ने के बजाय() को चलाता हूं, तो थ्रेड को बाधित करें, सॉकेट खुले रहेगी? – KomodoDave

उत्तर

2

आप पढ़ने के दौरान एक InterruptibleChannel बाधा डालते हैं, इसे बंद कर दिया है और एक ClosedByInterruptException फेंक दिया जाएगा। यदि आप बस एक पठन टाइमआउट चाहते हैं, तो एक चैनल का उपयोग न करें, बस एक नियमित सॉकेट; एक छोटा सा टाइमआउट के साथ Socket.setSoTimeout() को कॉल करें, और टाइमआउट ट्रिगर होने पर थ्रेड की अंतर्निहित() स्थिति की जांच करें। बेहतर अभी भी, धागे को बाधित करने के लिए अपनी आवश्यकता की समीक्षा करें। ये किस लिए?

+0

बहुत धन्यवाद :-) – KomodoDave

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

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