2010-05-19 15 views
14

काम नहीं करता मैं एक SocketChannel उपयोग करने के लिए और उसके पढ़ें/लिखें तरीकों के लिए समय समाप्त करना चाहते हैं। मैं सॉकेट कि मेरे SocketChannel इस तरह का मालिक के लिए समय समाप्त स्थापित करने के लिए कोशिश की है:समय समाप्त

channel.socket().setSoTimeout(TIMEOUT); 

लेकिन वह काम नहीं करता। क्या कोई अन्य समाधान है?

+3

दुर्भाग्य से, सॉकेट चैनल सीधे सेटसोटाइम विधि का समर्थन नहीं करता है। इसका उपयोग करने से दुखी हो जाएगी। – casey

+5

SocketChannel InterruptibleChannel इंटरफ़ेस लागू करता है, जिसका अर्थ है कि यदि आप अन्य धागा एक टाइमर सेट है कि और जब घड़ी समाप्त हो रहा है, यह धागा है, जिसमें अपने SocketChannel पढ़ बीच में हो सकता है, अपने पढ़ने() कॉल प्रवेश करने से पहले एक अलग थ्रेड बना सकते हैं() कॉल अवरुद्ध है। यदि रीड() कॉल पहले रिटर्न देता है, तो आप टाइमर थ्रेड को मार सकते हैं। –

+4

@StevensMiller और चैनल बंद हो जाएगा, और पढ़ा जाएगा 'बंद ByInterruptException.' बहुत उपयोगी नहीं है। मुझे बताया गया कि लिनक्स के व्यवहार से यह विचित्र कार्यान्वयन अनिवार्य है। – EJP

उत्तर

14

इस article के अनुसार, सॉकेट चैनेल अपने पढ़ने के संचालन के लिए समय-समय पर नहीं होगा, लेकिन आप इस प्रभाव को चैनल से दूसरे तरीके से पढ़ने से प्राप्त कर सकते हैं।

SocketChannel socketChannel; 
socketChannel.socket().setSocketTimeout(500); 
InputStream inStream = socketChannel.socket().getInputStream(); 
ReadableByteChannel wrappedChannel = Channels.newChannel(inStream); 

लपेटा हुआ चैनल से पढ़ना सॉकेटटाइम के अनुसार टाइमआउट होगा, लेकिन आपने सेट किया है।

+0

अच्छा समाधान। जावा है ... –

+1

अटक गया यह केवल एक कामकाज करने का सही तरीका नहीं है। उचित तरीके से एक पाश में Selector.select (timeout) का उपयोग करें और एक करता है, तो अच्छी तरह जांच – wzona

+0

'setSocketTimeout' अब है' setSoTimeout' साथ soTimeout/connectTimeout जाँच करने के लिए है, लेकिन एक ही तरह से काम करता है। –

-1

आप भी अपने चैनल गैर blockable बनाने और बस() System.currentTimeMillis उपयोग करने पर विचार कर सकता है।

2

आप जावा चयनकर्ता का उपयोग कर के साथ परिचित हैं, तो आप का अनुकरण कर सकते हैं सॉकेट चयनकर्ता का उपयोग करके अपने आप को समय-समाप्त हुआ। Sun.nio.ch.SocketAdaptor को देखना उपयोगी होता है।

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

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