2011-08-25 8 views
5

ソケットからの読み取りにBufferedInputStreamを使用しています。BufferedInputStreamとBlocking

socketInput.read(replyBuffer, 0, 7); 

私がmySocketが接続されていることを確認したmySocket = new Socket(ipAddress, port);

によってインスタンス化されprivate Socket mySocket;

mySocketとして定義されて

socketInput = new BufferedInputStream(mySocket.getInputStream()); 

mySocketによってインスタンス化され、次のようBufferedInputStream読み取り私のデバイス。私は自分のデバイスにデータを送ることができます。しかし、私は未知の理由で私のデバイスから受信していないが、それは問題ではありません。

私はBufferedInputStreamが何かのデータを読み込まないと、100ms後に戻ることを望みます。これを行うにはBufferedInputStreamをセットアップできますか?今、無期限にブロックされます。

+1

あらゆる種類のノンブロッキングまたはタイムアウトI/Oが必要な場合は、NIO( 'java.nio')クラスを使用する必要があります。 –

答えて

3

ソケットから読み取るためにバッファリングされたストリームを使用することは、一般的には悪い考えです。その理由は、内部バッファを満たすのに十分なデータがないと永遠に待機します7文字!)タイムアウトさせる方法はありません。 SocketInputStreamをそのまま使用すると、問題は解決しません。

+0

代わりにsocket.getInputStream.read(..)をお勧めしますか? –

+3

はい、それです。次に、別のポスターが提案されているので、 'setSoTimeout()'を使うことができます。 –

+0

ありがとう - それは働いた! –

4

ソケットに100msのタイムアウトを指定してください。 setSoTimeout

+0

これはBufferedInputStreamを使用している場合でも有効ですか? –

+0

あなたのリクエストを満たすのに十分なバイトが実際にあったとしても、あなたの 'read()'コールから 'SocketTimeoutException'を得るでしょう。それは良いことではありません。 –

+0

@ Code Monkeyこれは、InputStreamをラップしても有効です。 – umbr