関連するソケットを閉じずに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の組み込みクラスを使用してこれを達成する方法を提案したり、いくつかの情報では不可能であると指摘してくれたことに感謝します。
私は同じ効果を達成するための他の方法はあると思いますが、このアプローチが実現可能かどうかを知りたいと思っています。
ソケットで 'Selector'と' .select(int) 'を使うことができます。 – fge
ソケットに読み取りタイムアウトを設定します。 – jtahlborn
@fge - ありがとう。私はあなたが示唆したことを調査し、それは妥当と思われる。だから私は私のスレッドでmySelector.select()を直接read()の代わりに実行し、スレッドを中断しても、ソケットは開いたままになりますか? – KomodoDave