क्या आप संबंधित सॉकेट को बंद किए बिना जावा 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 इनबिल्ट वर्गों का उपयोग करना, या शायद उनका कहना है कि यह कुछ जानकारी के साथ संभव नहीं है इस लक्ष्य को हासिल करने के लिए एक तरह से सुझाव है कि सकता है बहुत आभारी होगी।
मैं समझता हूँ कि वहाँ एक ही प्रभाव को प्राप्त करने के लिए अन्य तरीके हैं, लेकिन फिर भी जानना आवश्यक है कि इस दृष्टिकोण संभव है उत्सुक हूँ।
आप सॉकेट पर एक 'Selector' और' .Select (int) 'उपयोग कर सकते हैं। – fge
सॉकेट पर एक पठन टाइमआउट सेट करें। – jtahlborn
@fge - धन्यवाद। मैंने जो सुझाव दिया है उसकी जांच की है और यह व्यवहार्य दिखता है। तो अगर मैं अपने थ्रेड में mySelector.select() को सीधे पढ़ने के बजाय() को चलाता हूं, तो थ्रेड को बाधित करें, सॉकेट खुले रहेगी? – KomodoDave