2011-12-13 15 views
9

関連するソケットを閉じずにJava InputStreamからの読み取りを中断する方法を知っていますか?ここjava.nio。*を使用してソケットを閉じずにInputStream#read()を中断する方法はありますか?

ソケット入力ストリームをつかみ、割り込みDataInputStreamをに変換するための現在の構成戦略である:

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

これはClosedByInterruptExceptionスロー可能オブジェクトをサポートするread(ByteBuffer)方法を提供ReadableByteChannelを利用します。

問題は、read()を呼び出すスレッドで割り込みを呼び出すと、DataInputStreamが呼び出され、基になるソケットが閉じられるという問題があります。

私の文脈では、ソケットを開いたままにする必要があります。 readコールは来ていないユーザー入力を待っているので、より高いコンポーネントに制御を戻し、最終的にreadに戻すために割り込みを使用しています。

誰かがJDKの組み込みクラスを使用してこれを達成する方法を提案したり、いくつかの情報では不可能であると指摘してくれたことに感謝します。

私は同じ効果を達成するための他の方法はあると思いますが、このアプローチが実現可能かどうかを知りたいと思っています。

+0

ソケットで 'Selector'と' .select(int) 'を使うことができます。 – fge

+1

ソケットに読み取りタイムアウトを設定します。 – jtahlborn

+0

@fge - ありがとう。私はあなたが示唆したことを調査し、それは妥当と思われる。だから私は私のスレッドでmySelector.select()を直接read()の代わりに実行し、スレッドを中断しても、ソケットは開いたままになりますか? – KomodoDave

答えて

2

読み込み中にInterruptibleChannelを中断すると、読み込み中にInterruptibleChannelが中断された場合に閉じられ、ClosedByInterruptExceptionがスローされます。読み込みタイムアウトが必要な場合は、チャネルをまったく使用せず、通常のSocketだけを使用してください。短いタイムアウトでSocket.setSoTimeout()を呼び出し、タイムアウトが発生するたびにスレッドのisInterrupted()ステータスを確認してください。さらに良いことに、スレッドを中断する要件を確認してください。それは何のためですか?

+0

多くの感謝:-) – KomodoDave

関連する問題