2011-08-25 18 views
5

Estoy usando un BufferedInputStream para leer desde un socket. El BufferedInputStream dice lo siguiente:BufferedInputStream y bloqueo

socketInput.read(replyBuffer, 0, 7); 

Se crea una instancia por

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

mySocket se define como private Socket mySocket;

mySocket se instancia por mySocket = new Socket(ipAddress, port);

He comprobado que mySocket está conectado a mi dispositivo. Puedo enviar datos a mi dispositivo; sin embargo, no recibo de mi dispositivo por razones desconocidas, pero ese no es el problema.

Quiero que mi BufferedInputStream vuelva después de decir 100 ms si no lee ningún dato. ¿Puede configurarse el BufferedInputStream para hacer esto? En este momento, bloquea indefinidamente.

+1

Si quiere cualquier clase de E/S sin tiempo de espera o bloqueo, debe usar las clases NIO ('java.nio'), no las cosas en' java.io'. –

Respuesta

3

En general, es una mala idea usar un flujo de búfer para leer desde un socket, por esta razón: esperará por siempre si no ve suficientes datos para llenar su búfer interno (que va a ser más grande que 7 caracteres!) No hay forma de hacer que pase el tiempo. Simplemente use el SocketInputStream directamente, y el problema desaparece.

+0

, entonces usted está recomendando socket.getInputStream.read (..)? –

+3

Sí, eso es todo. Luego puede usar 'setSoTimeout()', como sugirió otro afiche, y obtendrá el comportamiento que desea. –

+0

gracias - ¡funcionó! –

4

Especifique el tiempo de espera de 100 ms para su socket. setSoTimeout

+0

¿esto sigue siendo válido si estoy usando un BufferedInputStream? –

+0

Lo que sucederá es que obtendrá una 'SocketTimeoutException' de su llamada' read() ', aunque haya suficientes bytes para satisfacer su solicitud. Eso no es bueno. –

+0

@Code Monkey, sigue siendo válido para cualquier ajuste de InputStream. – umbr